1.操作SDO_WRITE之前请先阅读SDO_READ
2.添加SDO_WRITE_DATA或SDO_WRITE4
SDO_WRITE_DATA代码格式如下
PROGRAM SDO_WRITE_TEST
VAR
sdo_write_data: CIA405.SDO_WRITE_DATA;
runResult: BOOL;
runErrorEnum: CIA405.CANOPEN_KERNEL_ERROR;
//str1 : STRING := 'This is a string!'; //str1 是一个默认长度的字符串(默认长度为 80 个字符)。
str2: STRING(20) := 'Zhanghz66'; //str2 是一个长度为 20 的字符串。
//strArray: ARRAY[1..3] OF STRING := ['First', 'Second', 'Third']; //strArray 是一个包含 3 个字符串的数组,每个元素都被初始化。
//字符串内容用单引号(')括起来。
//dataArr: ARRAY [0..3] OF BYTE := [1,2,3];
strLength: BYTE := 12;
errorInfo: CIA405. SDO_ERROR;
count : UDINT := 0;
END_VAR
sdo_write_data(
NETWORK:= 1,
ENABLE:= TRUE,
TIMEOUT:= 2000,
CONFIRM=> runResult,
ERROR=> runErrorEnum,
DEVICE:= 2,
CHANNEL:= 0,
INDEX:= 16#2017,
SUBINDEX:= 16#00,
MODE:= CIA405.SDO_MODE.SEGMENTED,
DATA:= ADR(str2),
DATALENGTH:= 10,
ERRORINFO=> errorInfo
);
count:= count + 1;
IF count > 10000 THEN
count := 0;
END_IF
3.SDO_WRITE4代码格式如下:
PROGRAM SDO_WRITE4_TEST
VAR
sdo_write4: CIA405.SDO_WRITE4;
runResult: BOOL;
runErrorEnum: CIA405.CANOPEN_KERNEL_ERROR;
//dataVal: DWORD := 16#FAFBFCFD; // DWARD就是uint32
dataArr: ARRAY [1..4] OF BYTE := [16#FA, 16#FB, 16#FC, 16#FD];
//dataArr: ARRAY [1..4] OF BYTE := [1];
errorInfo: CIA405.SDO_ERROR;
count : UDINT := 0;
END_VAR
sdo_write4(
NETWORK:= 1,
ENABLE:= TRUE,
TIMEOUT:= 3000,
CONFIRM=> runResult,
ERROR=> runErrorEnum,
DEVICE:= 2,
CHANNEL:= 0,
INDEX:= 16#2018,
SUBINDEX:= 16#00,
DATA:= dataArr,
DATALENGTH:= 4,
ERRORINFO=> errorInfo,
);
count:= count + 1;
IF count > 10000 THEN
count := 0;
END_IF
3.函数入参出参解释
DATA:----
pointer to data which should be written (data has to be in little endian byte order)
指定要写入的数据内存的指针(数据必须以小端顺序写入)。
----在SDO_WRITE4中此DATA代表的意思如下:
DATALENGTH:----
length of data in bytes
写入的字节大小(单位:byte),注意这里直接写固定值即可,但是需要与对象字典中的大小一致,查看TestSlave.c中对应数组的大小可以确定这里写多少,例如:

在TestSlave.c中SlaveMap0是索引0x2017处的变量,初始化值为"000000",数组大小为10,所以这里DATALENGTH应该写10(不知道小于10的值是否可以)。
ERRORINFO:----
contains abort code in little endian in case of ERROR is CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_OTHER_ERROR
如果ERROR为CANOPEN_KERNEL_ERROR.CANOPEN_KERNEL_OTHER_ERROR,则以小端序终止代码。
注意:这里代表错误码,显示是10禁止的,需要转换为16进制的错误码,然后去CIA301协议中查这个错误码代表什么意思。比如:84,148,224的16进制就是504 0000,即去Cia301所有0504发现如下:

正常为0

浙公网安备 33010602011771号