我新建了一个数据模块,用来存放一些数组。新的数组永远放在数据模块的开头位置,所以每次存放数据之前都需要将数据模块中的数据向后移sizeof(数组)的长度。我的操作方式是这样的
memmove(p数据模块+sizeof(数组),p数据模块,模块长度-sizeof(数组))。运行程序,先执行memmove指令,然后再将数据模块中的数据读到数组变量,发现数据模块中的数确实按照意图改变。但大概30s到1分钟之后plc到serv模式,故障代码是6403,模块校验和错误。这期间没有其他程序在运行。不知道问题处在哪里,请各位帮分析一下原因。
PROGRAM _INIT
FOR index0 := 0 TO 99 DO
Array0[index0] := index0;
END_FOR;
sName := ADR('obj01');
END_PROGRAM
PROGRAM _CYCLIC
CASE StartStep OF
0:
DatObjCreate_0.enable := 1;
DatObjCreate_0.grp := 0;
DatObjCreate_0.len := SIZEOF(ReadArray);
DatObjCreate_0.MemType := doUSRROM;
DatObjCreate_0.pName := sName;
DatObjCreate_0.pCpyData := ADR(Array0);
DatObjCreate_0.Option := 1;
DatObjCreate_0();
IF DatObjCreate_0.status = 0 OR DatObjCreate_0.status = 20601 THEN
StartStep := 1;
END_IF;
1:
DatObjInfo_0(enable := 1, pName := sName);
IF DatObjInfo_0.status=0 THEN
StartStep := 2;
END_IF;
2:
END_CASE;
IF MoveOffset=1 THEN
MoveOffset := 0;
memmove(DatObjInfo_0.pDatObjMem + SIZEOF(Array0),DatObjInfo_0.pDatObjMem,DatObjInfo_0.len - SIZEOF(Array0));
END_IF;
IF CommandRead=1 THEN
CommandRead := 0;
DatObjRead_0.enable := 1;
DatObjRead_0.ident := DatObjInfo_0.ident;
DatObjRead_0.len := SIZEOF(ReadArray);
DatObjRead_0.Offset := 0;
DatObjRead_0.pDestination := ADR(ReadArray);
DatObjRead_0();
END_IF;
IF CommandWrite=1 THEN
CommandWrite := 0;
DatObjWrite_0.enable := 1;
DatObjWrite_0.ident := DatObjInfo_0.ident;
DatObjWrite_0.len := SIZEOF(ReadArray);
DatObjWrite_0.Offset := 0;
DatObjWrite_0.pSource := DatObjInfo_0.pDatObjMem;
DatObjWrite_0();
END_IF;
END_PROGRAM