/* LWR "logical memory write" primitive. Blocking.
* 逻辑写(LWR) Logical write 原语 阻塞
* @param[in] port = port context struct
* 端口(port)结构体
* @param[in] LogAdr = Logical memory address
* 逻辑内存地址
* @param[in] length = length of databuffer
* 数据缓冲区的长度
* DATA 数据区域的长度
* @param[in] data = databuffer to write to slave.
* 要写入从站的数据缓冲区
* @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET
* 超时时间[单位:us(微秒)],标准是EC_TIMEOUTRET[=2000us(微秒)]
* @return Workcounter or EC_NOFRAME
* 返回值 工作计数器 或 EC_NOFRAME(无数据帧返回=-1)
*/
int ecx_LWR(ecx_portt *port, uint32 LogAdr, uint16 length, void *data, int timeout)
{
uint8 idx;/* IDX 索引 */
int wkc;/* 工作计数器 */
/* get fresh index *//* 获取最新索引 */
idx =/* IDX 索引 */
ecx_getindex(//获取新的帧标识符索引并分配相应的发送缓存区
port);/* 端口(port)结构体 */
/* setup datagram *//*设置数据报*/
ecx_setupdatagram(//在标准以太网帧中生成和设置 EtherCAT 数据报
port,/* 端口(port)结构体 */
&(port->txbuf/* 发送缓存区 */[idx/* IDX 索引 */]),
EC_CMD_LWR, /* 逻辑写(LWR) *//* Logical write */
idx,/* IDX 索引 */
LO_WORD(/* 取DWORD低位WORD的宏*/
LogAdr), /* 逻辑内存地址 */
HI_WORD(/* 取DWORD高位WORD的宏*/
LogAdr), /* 逻辑内存地址 */
length, /* 数据缓冲区的长度 */
data); /* 要写入从站的数据缓冲区 */
/* send data and wait for answer *//* 发送数据并等待应答 */
wkc = /* 工作计数器 */
ecx_srconfirm(// 发送和接收帧(阻塞)
port, /* 端口(port)结构体 */
idx,/* IDX 索引 */
timeout); /* 超时时间[单位:us(微秒)] */
/* clear buffer status *//* 清除缓冲区状态 */
ecx_setbufstat(// 设置发送缓存区(rx buffer)状态
port, /* 端口(port)结构体 */
idx,/* IDX 索引 */
EC_BUF_EMPTY);/* 缓存区状态:空=0 */
return wkc;/* 工作计数器 */
}