一、主机请求节点状态
1、函数:UNS8 masterRequestNodeState(CO_Data* d, UNS8 nodeId)
2、参数
d:CO_Data
nodeId:节点ID
3、调用方式masterRequestNodeState(&master_objdict_Data,0x01);
4、说明节点状态存储在struct_CO_Data
结构体的e_nodeState NMTable[NMT_MAX_NODE_ID];
这个数组当中,主要参数为:
01h为启动命令(让节点进入操作状态);
02h为停止命令(让节点进入停止状态);
80h为进入预操作状态(让节点进入预操作状态);
81h为复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态);
82h为复位节点通讯(让节点的 CAN 和 CANopen 通讯重新初始化,一般用于总线收到
干扰,导致节点总线错误被动,或者总线关闭时)。
二、主机改变节点状态
1、函数:UNS8 masterSendNMTstateChange(CO_Data* d, UNS8 nodeId, UNS8 cs)
2、参数
d:CO_Data
nodeId:节点ID
cs:节点状态
3、调用方式masterSendNMTstateChange(&master_objdict_Data,0x01,NMT_Start_Node);
4、cs参数取值为:
01h为启动命令(让节点进入操作状态);
02h为停止命令(让节点进入停止状态);
80h为进入预操作状态(让节点进入预操作状态);
81h为复位节点应用层(让节点的应用恢复初始状态,比如列车门都恢复打开状态);
82h为复位节点通讯(让节点的 CAN 和 CANopen 通讯重新初始化,一般用于总线收到
干扰,导致节点总线错误被动,或者总线关闭时)。
三、主机写从机字典(修改从机通信)
1、函数:UNS8 writeNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS32 count, UNS8 dataType, void *data, UNS8 useBlockMode)
2、参数
d:CO_Data
nodeId:节点ID
index:索引
subIndex:子索引
count:写入字节数
dataType:数据类型
data:数据
useBlockMode:返回错误代码
3、调用方式
size=2;
sendData[0]=0xd0;
sendData[1]=0x07;
writeNetworkDict(&master_objdict_Data,0x01,0x1017,0,size,uint16,&sendData,0); //写从节点0x01的字典索引为0x1017的内容
while(getWriteResultNetworkDict(&master_objdict_Data,0x01,&abortCode) == SDO_UPLOAD_IN_PROGRESS) //等待写入完成
{
}
printf("data:%d size:%d abortCode:%d\r\n",data,size,abortCode);
四、主机读从机字典(读取从机参数)
1、函数:readNetworkDict (CO_Data* d, UNS8 nodeId, UNS16 index, UNS8 subIndex, UNS8 dataType, UNS8 useBlockMode)
2、参数
d:CO_Data
nodeId:节点ID
index:索引
subIndex:子索引
dataType:数据类型
useBlockMode:返回错误代码
3、调用方式
u16 data; //存放读取的数据
u32 size; //读取的字节
u32 abortCode; //返回错误代码
readNetworkDict(&master_objdict_Data,0x01,0x1017,0,sizeof(UNS16),0); //读取从机1字典索引为0x1017的内容
while(getReadResultNetworkDict(&master_objdict_Data,0x01,&data,&size,&abortCode) ==SDO_UPLOAD_IN_PROGRESS) //等待读取完成
{
}
printf("data:%d size:%d abortCode:%d\r\n",data,size,abortCode);