特殊指令:CANOpen通讯


CANOpen_ODSet:设置本机对象字典数据

CANOpen_ODSet指令用于设置本机对象字典中的数据。

参数名称数据类型读写方向说明
EN能流输入当EN使能时,将PLC中的数据写入对象字典。
PortUSINT输入对象字典所属的CANOpen通讯端口。
IndexUINT输入对象字典的主索引。
SubIndexUSINT输入对象字典的子索引。
DataUSINT输入写入对象字典的数据开始地址。
LengthUSINT输入写入对象字典的数据长度。
ErrUSINT输出错误代码,详见附录I。

CANOpen_ODSet指令将PLC数据写入对象字典。Data用于指定PLC数据地址,Length用于指定PLC数据长度。数据长度可以小于对象字典中定义的数据长度,字典中剩余的数据将会保留。需要注意的是,对象字典采用小端格式存储数据,PLC采用大端存储数据。如果对象字典中对数据类型的定义不是字符串,也不是域,对于长度小于或等于8字节的PLC数据,指令会先进行大小端的转换,再写入对象字典。同时,如果对象字典中的数据定义了数据范围,超出范围的数据将不会被写入。

CANOpen_ODGet:获取本机对象字典数据

CANOpen_ODSet指令用于获取本机对象字典中的数据。

参数名称数据类型读写方向说明
EN能流输入当EN使能时,将对象字典中的数据写入PLC。
PortUSINT输入对象字典所属的CANOpen通讯端口。
IndexUINT输入对象字典的主索引。
SubIndexUSINT输入对象字典的子索引。
DataUSINT输入获取对象字典的数据存放地址。
BufLengthUSINT输入获取对象字典的数据最大长度。
LengthUSINT输出实际获取的数据长度。
ErrUSINT输出错误代码,详见附录I。

CANOpen_ODGet指令将对象字典数据写入PLC。Data用于指定PLC数据地址,BufLength用于指定获取对象字典数据的最大长度,Length返回对象字典中定义的长度。数据的最大长度BufLength必须大于或等于对象字典中定义的长度,如果BufLength小于对象字典中定义的长度,将会返回错误。需要注意的是,对象字典采用小端格式存储数据,PLC采用大端存储数据。如果对象字典中对数据类型的定义不是字符串,也不是域,指令会先进行大小端的转换,再写入PLC。

CANOpen_SDOWrite4:远程设备对象字典写数据

CANOpen_SDOWrite4指令用于向远程设备的对象字典写入数据

参数名称数据类型读写方向说明
EN能流输入当EN使能时,进行远程设备对象字典的写入。指令会维护一个通讯任务队列,多个远程设备对象字典读写指令可以同时使能,系统会根据任务队列依次进行通讯操作。
PortUSINT输入需要操作的CANOpen通讯端口。
NodeIdUSINT输入远程设备的CANOpen节点ID。
IndexUINT输入远程设备对象字典的主索引。
SubIndexUSINT输入远程设备对象字典的子索引。
EdianUSINT输入数据是否需要进行大小端转换:0 - 不需要转换(字符串或域);1 - 需要转换。
DataUSINT输入写入对象字典的数据开始地址。
LengthUSINT输出写入对象字典的数据长度,根据CANOpen协议,不能超过32字节。
DoneBIT输出通讯任务是否完成。
ErrUSINT输出错误代码,详见附录I。

和指令CANOpen_ODSet指令类似,也是对象字典数据的读写,不过CANOpen_SDOWrite4指令通过通讯的方式操作远程设备。因为不知道远程设备对象字典中的数据类型,这里必须通过Endian参数来手动指定是否需要进行大小端转换。对于不超过4字节的数据,CANOpen_SDOWrite4不使用块传输方式。

CANOpen_SDORead4:远程设备对象字典读数据

CANOpen_SDORead4指令用于从远程设备的对象字典读取数据。

参数名称数据类型读写方向说明
EN能流输入当EN使能时,进行远程设备对象字典的读取。指令会维护一个通讯任务队列,多个远程设备对象字典读写指令可以同时使能,系统会根据任务队列依次进行通讯操作。
PortUSINT输入需要操作的CANOpen通讯端口。
NodeIdUSINT输入远程设备的CANOpen节点ID。
IndexUINT输入远程设备对象字典的主索引。
SubIndexUSINT输入远程设备对象字典的子索引。
EdianUSINT输入数据是否需要进行大小端转换:0 - 不需要转换(字符串或域);1 - 需要转换。
DataUSINT输入获取对象字典的数据存放地址。
BufLengthUSINT输入获取对象字典的数据最大长度。
LengthUSINT输出实际获取的数据长度。
DoneBIT输出通讯任务是否完成。
ErrUSINT输出错误代码,详见附录I。

和指令CANOpen_ODGet指令类似,也是对象字典数据的读写,不过CANOpen_SDORead4指令通过通讯的方式操作远程设备。因为不知道远程设备对象字典中的数据类型,这里必须通过Endian参数来手动指定是否需要进行大小端转换。对于不超过4字节的数据,CANOpen_SDOWrite4不使用块传输方式。

CANOpen_SDOWrite:远程设备对象字典写数据

CANOpen_SDOWrite指令用于向远程设备的对象字典写入数据

参数名称数据类型读写方向说明
EN能流输入当EN使能时,进行远程设备对象字典的写入。指令会维护一个通讯任务队列,多个远程设备对象字典读写指令可以同时使能,系统会根据任务队列依次进行通讯操作。
PortUSINT输入需要操作的CANOpen通讯端口。
NodeIdUSINT输入远程设备的CANOpen节点ID。
IndexUINT输入远程设备对象字典的主索引。
SubIndexUSINT输入远程设备对象字典的子索引。
EdianUSINT输入数据是否需要进行大小端转换:0 - 不需要转换(字符串或域);1 - 需要转换。
DataUSINT输入写入对象字典的数据开始地址。
LengthUSINT输出写入对象字典的数据长度,根据CANOpen协议,不能超过32字节。
DoneBIT输出通讯任务是否完成。
ErrUSINT输出错误代码,详见附录I。

和指令CANOpen_ODSet指令类似,也是对象字典数据的读写,不过CANOpen_SDOWrite指令通过通讯的方式操作远程设备。因为不知道远程设备对象字典中的数据类型,这里必须通过Endian参数来手动指定是否需要进行大小端转换。对于不超过4字节的数据,CANOpen_SDOWrite依然使用块传输方式。

CANOpen_SDORead:远程设备对象字典读数据

CANOpen_SDORead指令用于从远程设备的对象字典读取数据。

参数名称数据类型读写方向说明
EN能流输入当EN使能时,进行远程设备对象字典的读取。指令会维护一个通讯任务队列,多个远程设备对象字典读写指令可以同时使能,系统会根据任务队列依次进行通讯操作。
PortUSINT输入需要操作的CANOpen通讯端口。
NodeIdUSINT输入远程设备的CANOpen节点ID。
IndexUINT输入远程设备对象字典的主索引。
SubIndexUSINT输入远程设备对象字典的子索引。
EdianUSINT输入数据是否需要进行大小端转换:0 - 不需要转换(字符串或域);1 - 需要转换。
DataUSINT输入获取对象字典的数据存放地址。
BufLengthUSINT输入获取对象字典的数据最大长度。
LengthUSINT输出实际获取的数据长度。
DoneBIT输出通讯任务是否完成。
ErrUSINT输出错误代码,详见附录I。

和指令CANOpen_ODGet指令类似,也是对象字典数据的读写,不过CANOpen_SDORead指令通过通讯的方式操作远程设备。因为不知道远程设备对象字典中的数据类型,这里必须通过Endian参数来手动指定是否需要进行大小端转换。对于不超过4字节的数据,CANOpen_SDORead依然使用块传输方式。

附录I

错误代码:

  • 0 : None:无错误。
  • 1 : ReadNotAllowed:读操作被禁止。
  • 2 : WriteNotAllowed:写操作被禁止。
  • 3 : NoSuchObject:对象字典中索引不存在。
  • 4 : NotMappable:数据未映射。
  • 5 : AccessFailed:访问失败。
  • 6 : LengthDataInvalid:长度无效。
  • 7 : NoSuchSubIndex:对象字典中子索引不存在。
  • 8 : ValueRangeExceeded:数据范围超界。
  • 9 : ValueTooLow:数据太小。
  • 10 : ValueTooHigh:数据太大。
  • 11 : ToggleNotAlterned:切换未更改。
  • 12 : TimedOut:超时错误。
  • 13 : CsNotValid:CS无效。
  • 14 : InvalidBlockSize:块大小无效。
  • 15 : OutOfMemory:内存不足。
  • 16 : GeneralError:一般错误。
  • 17 : LocalCtrlError:本地控制错误。
  • 18 : TaskNotExist:任务不存在。
  • 19 : PortNotExist:端口不存在。
  • 20 : QueueIsFull:任务队列满。
  • 255 : Unknown:未知错误。