0
Under review

S7_Interface AreaReadWriteMode MinAreaDBInput causes data reading exception

陈喜成 yesterday at 1:38 a.m. in realvirtual.io Starter and Professional updated by Support 3 hours ago 1

Hello, I am a Chinese user and I greatly appreciate your company's products

Based on the Pro6 Ver8152 test, the S7_interface AreaReadWriteMode DB test found the following issues (everything is normal in non AreaReadWriteMode mode, but the communication load is high):


1.At the beginning, the O/I of my DB5 corresponded to PLC Output/Input and S7_interface settings:

AreaReadWriteMode:True

DBOutputs:5

MinAreaDBOutput:0

MaxAreaDBOutput:143

DBInputs:5

MinAreaDBInput:144

MaxAreaDBInput:277

ArgumentException: Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.

System.Buffer.BlockCopy (System.Array src, System.Int32 srcOffset, System.Array dst, System.Int32 dstOffset, System.Int32 count) (at :0)

realvirtual.S7Interface.WriteS7 () (at Assets/realvirtual/Interfaces/S7TCPIP/S7Interface.cs:933)

realvirtual.S7Interface.CommunicationThreadUpdate () (at Assets/realvirtual/Interfaces/S7TCPIP/S7Interface.cs:1083)

realvirtual.InterfaceThreadedBaseClass.CommunicationThread (System.Threading.CancellationToken token) (at Assets/realvirtual/Interfaces/InterfaceThreadedBaseClass.cs:226)

realvirtual.InterfaceThreadedBaseClass.b__36_0 () (at Assets/realvirtual/Interfaces/InterfaceThreadedBaseClass.cs:124)

System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) (at :0)

System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) (at :0)

System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) (at :0)

System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) (at :0)

System.Threading.ThreadHelper.ThreadStart () (at :0)

UnityEngine.<>c:b__0_0(Object, UnhandledExceptionEventArgs)


2. Through debugging and positioning, I modified some of the code and wrote it to PLC.DB.tags normally, but all reads failed without any errors:

WriteS7()

{

...

if (AreaReadWriteMode)

{

...

case S7InterfaceSignal.S7TYPE.BYTE:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 1);

break;

case S7InterfaceSignal.S7TYPE.WORD:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 2);

break;

case S7InterfaceSignal.S7TYPE.DWORD:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 4);

break;

case S7InterfaceSignal.S7TYPE.SINT:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 2);

break;

case S7InterfaceSignal.S7TYPE.INT:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 2);

break;

case S7InterfaceSignal.S7TYPE.DINT:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 4);

break;

case S7InterfaceSignal.S7TYPE.USINT:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 1);

break;

case S7InterfaceSignal.S7TYPE.UINT:

Buffer.BlockCopy(bytes, 0, dstarea, pos, 2);

break;

...

}

...

}


3. Clone PLC DB5 to DB3, set DBInputs to 3, MinAreaDBInput to 0, and read/write everything is normal


4. Modify MinAreaDBInput: 2, the last 2Byte Read in the Read area is invalid

Modify MinAreaDBInput: 4, the last 4Byte Read in the Read area is invalid

... and so on


5.In OPCUA mode, Unity is played twice, but the value of PLCINput is restored to default, but the PLC memory remains in the same state as when the first attempt ended without any changes


6. I debugged the same Unity simulation project implementation based on our own S7.NET communication program: the conveyor belt transfers the tray until the PLC detects the Unity sensor signal and stops, and the OPCUA signal of RealVirtual.io always detects it and runs for a distance before stopping (the faster the speed, the farther it exceeds the distance). However, our own use of S7.NET does not have this problem (we use S7.NET.ReadClass to batch read, parse, update the drive object, update the ValueChange, update the WriteData, and WriteClass to time 50ms WirteData to the PLC).


Could you please help analyze and provide feedback on the above issues? Additionally, I have code to convert the DB exported by the PLC into complete XML, and I hope to modify it into the tag import mechanism of OPCUA in the future (as RealVirtual 6 does not support DB import, I am currently using OPCUA to import PLCTags, and then using OpcuaTagoS7 to change the OPCUA tag to S7Interface AreaReadWriteMode for communication, as I am concerned about the performance issues of OPCUA's subscription mode for large-scale PLCTAGS)


I have sent you the relevant attachments via email. Regarding the method of generating PlcTagsXML from DB, you can also contact me if you need it, because we have successfully tested and verified this aspect through the project (the method found online has multiple bugs in the calculation of S7 address offset).


Looking forward to your reply~


S7_Interface AreaReadWriteMode Debug.zip

By:Liuxingsuifeng

Email: 410701881@qq.com

Under review

Hi, thanks for all the hint and advices. For 1-4 please check attached update of the S7Interface. 

For 6 - if i understand it correctly - your proposal is to do a new importer which is also able to read dbs? Please explain us a little bit more what we should do based on your discovery.

Also you have your own implementation of S7 protocoll which is faster - if i understand it correctly?


Best regards

Thomas


S7TCPIP.unitypackage