From dde6cef26fe162a8538845d8d9ea4d8b597b3739 Mon Sep 17 00:00:00 2001 From: Jonny007-MKD Date: Wed, 21 May 2014 11:26:45 +0000 Subject: [PATCH] Modbus/include/ModbusClientCommon.cin Removed the 9 seperate times Introduced pending, sent and ack stacks to allow concurrent requests Introduced timer gtRobin that monitors the stacks, sends the packets and checks for timeouts Modbus/include/ModbusCommonStructs.cin added enum ModbusFuncCode Modbus/include/ModbusFunctions.cin fixed analog modules Modbus/include/TcpCommon.cin don't use local ip anymore Modbus/ModbusClientUDP.can no state machine for reading configuration :) --- Modbus/ModbusClientUDP.can | 96 ++--- Modbus/include/ModbusClientCommon.cin | 483 +++++++---------------- Modbus/include/ModbusCommonStructs.cin | 16 +- Modbus/include/ModbusFunctions.cin | 25 +- Modbus/include/ModbusTcpClientCommon.cin | 9 +- Modbus/include/ModbusUdpClientCommon.cin | 9 +- Modbus/include/TcpCommon.cin | 14 +- Modbus/include/TcpUdpCommon.cin | 2 + Modbus/include/UdpCommon.cin | 13 +- Modbus/modbus.cfg | 424 +++++++++----------- Modbus/modbus.vsysvar | 9 +- 11 files changed, 405 insertions(+), 695 deletions(-) diff --git a/Modbus/ModbusClientUDP.can b/Modbus/ModbusClientUDP.can index cc60c0b..4073578 100644 --- a/Modbus/ModbusClientUDP.can +++ b/Modbus/ModbusClientUDP.can @@ -11,6 +11,7 @@ variables char gNodeName[10] = "ClientUDP"; msTimer muster, clock; + msTimer gtRead; byte gX[2] = {1, 0}; enum MbClientState {INIT, ConfWago1, ConfWago2, ConfWago3, ConfWago4, ConfWago5, ConfWago6, DATA}; @@ -22,18 +23,22 @@ variables on preStart { writeClear(0); - setStartdelay(10); } on start { - char ip[16]; - sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config", "IP", ip, elCount(ip)); - ModbusInit(ip, @sysvar::Config::Modbus::Port); - + ModbusInit(); + SysvarInit(); + + // Read serial code, additional stuff is done in OnModbusReceiveRegisters gState = ConfWago1; ModbusReadRegisters(0x2011, 1); + ModbusReadRegisters(0x2012, 1); + ModbusReadRegisters(0x2030, 65); + ModbusReadRegisters(0x2031, 64); + ModbusReadRegisters(0x2032, 64); + ModbusReadRegisters(0x2033, 63); } @@ -76,20 +81,25 @@ void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbr, word num char str[20*5]; long fehler; byte i; + struct ModbusReqRead mbrq; - switch (gState) + if (!gQueueAck.ContainsKey(mbr.Header.TxID)) + return; + + memcpy_n2h(mbrq, gQueueAck[mbr.Header.TxID].Buffer); + + switch (mbrq.Address) { - case ConfWago1: + case 0x2011: @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::SerialCode = mbr.Data[0]; - gState = ConfWago2; - ModbusReadRegisters(0x2012, 1); break; - case ConfWago2: + case 0x2012: @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::DeviceCode = mbr.Data[0]; - gState = ConfWago3; - ModbusReadRegisters(0x2030, 65); break; - case ConfWago3: + case 0x2030: + case 0x2031: + case 0x2032: + case 0x2033: for (i = 0; i < 65; i++) { if (mbr.Data[i] == 0x0000) @@ -99,55 +109,11 @@ void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbr, word num } ParseDeviceCode(mbr.Data[i]); } - - gState = ConfWago4; - ModbusReadRegisters(0x2031, 64); - break; - case ConfWago4: - for (i = 0; i < 64; i++) - { - if (mbr.Data[i] == 0x0000) - { - gState = DATA; - return; - } - ParseDeviceCode(mbr.Data[i]); - } - - gState = ConfWago5; - ModbusReadRegisters(0x2032, 64); - break; - case ConfWago5: - for (i = 0; i < 64; i++) - { - if (mbr.Data[i] == 0x0000) - { - gState = DATA; - return; - } - ParseDeviceCode(mbr.Data[i]); - } - - gState = ConfWago5; - ModbusReadRegisters(0x2033, 64); - break; - case ConfWago6: - for (i = 0; i < 64; i++) - { - if (mbr.Data[i] == 0x0000) - { - gState = DATA; - return; - } - ParseDeviceCode(mbr.Data[i]); - } - - gState = DATA; break; default: // Do everything else here dbin_to_strhex(mbr.Data, str); - writeLineEx(0, 1, "<%NODE_NAME%> OnModbusReceiveRegisters: Received %d bytes: %s", mbr.ByteCount, str); + writeLineEx(0, 1, "<%NODE_NAME%> OnModbusReceiveRegisters: Received %d bytes at 0x%04X: %s", mbr.ByteCount, mbrq.Address, str); break; } } @@ -173,9 +139,19 @@ void OnModbusWriteMasksSuccess(struct ModbusResConfirmMasks mbc) // Key events ------------------------------------------------------------------------- -on key 'i' // read the configuration +on key 'n' // read the configuration { + setTimerCyclic(gtRead, 1, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config::Interval); } + +on timer gtRead +{ + if (@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters > 0) + ModbusReadRegisters(0x0000, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters); + if (@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits > 0) + ModbusReadBits(@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters * 2, @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits); +} + on key 'r' // read the first bits { ModbusReadBits(0, 51); @@ -308,4 +284,4 @@ on timer clock x[0] = (s & 0x01) | (s & 0x02) | ((s & 0x04) << 1) | ((s & 0x08) << 4); x[1] = (s & 0x10) << 3; ModbusWriteBits(0, 16, x); -} +} \ No newline at end of file diff --git a/Modbus/include/ModbusClientCommon.cin b/Modbus/include/ModbusClientCommon.cin index e3cf5aa..13cd79b 100644 --- a/Modbus/include/ModbusClientCommon.cin +++ b/Modbus/include/ModbusClientCommon.cin @@ -8,38 +8,34 @@ includes variables { const word gMaxPacketLength = __size_of(struct ModbusReqWriteRegisters); + + msTimer gtRobin; + word gTxID = 0x0000; // Transaction Identifier for Modbus. Used as index for gQueue - // Global storage for pending requests, associated by funcCode - struct + // Global storage for pending and sent requests, associated by TxID + struct QueueElement { - byte Count; + word TimeoutTicks; + byte Timeouts; word Length; byte Buffer[gMaxPacketLength]; - } gRequests[int64, 8]; - - - - msTimer gTimerModbusReadBits; - msTimer gTimerModbusReadRegisters; - msTimer gTimerModbusWriteBit; - msTimer gTimerModbusWriteRegister; - msTimer gTimerModbusWriteBits; - msTimer gTimerModbusWriteRegisters; - msTimer gTimerModbusWriteMasks; - msTimer gTimerModbusReadWriteRegisters; + }; + struct QueueElement gQueuePending[long, 2]; + struct QueueElement gQueueSent[long, 2]; + struct QueueElement gQueueAck[long, 2]; } -void ModbusInit(char Remote_IP[], word Remote_Port) +void ModbusInit() { - sysDefineVariableString("%NETWORK_NAME%::%NODE_NAME%::Info", "IP", Remote_IP); - sysDefineVariableInt("%NETWORK_NAME%::%NODE_NAME%::Info", "Port", Remote_Port); - - ModbusConnectTo(Remote_IP, Remote_Port); + char ip[16]; + sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config", "IP", ip, elCount(ip)); + + ModbusConnectTo(ip, @sysvar::Config::Modbus::Port); } void ModbusMakeHeader(struct ModbusApHeader mbap, word length) { - mbap.TxID = 0x1234; // [2] Transaction ID. Not needed here? + mbap.TxID = gTxID++; // [2] Transaction ID mbap.Protocol = 0x0000; // [2] Protocol ID = 0 = Modbus mbap.Length = length - __offset_of(struct ModbusApHeader, UnitID); // [2] Length; Number of bytes following mbap.UnitID = 0xFF; // [1] Unit identifier; not relevant @@ -56,9 +52,6 @@ void ModbusReadBits(word address, word count) byte buffer[length]; struct ModbusReqRead mbr; - if (gRequests[funcCode].Count > 0) // TODO: a transmission is in progress. What shall we do? - return; - ModbusMakeHeader(mbr.Header, length); // Payload mbr.Header.FuncCode = funcCode; // [1] Function Code; 1: Read Coils (DI), 2: Read Discret Inputs (DIO), seems to be the same for WAGO 750-881 @@ -66,29 +59,20 @@ void ModbusReadBits(word address, word count) mbr.Count = count; // [2] Number of items; 1:max 2000=0x7D0 memcpy_h2n(buffer, mbr); - ModbusSend(buffer); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, length); - gRequests[funcCode].Length = length; - gTimerModbusReadBits.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, length, mbr.Header.TxID); } /// void OnModbusReceiveBits(byte buffer[]) { - const byte funcCode = 0x01; struct ModbusResReceiveBits mbr; byte bitStatus[1968]; word numBits; byte i, j; - gTimerModbusReadBits.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbr, buffer); - numBits = (gRequests[funcCode].Buffer[10] << 8) + gRequests[funcCode].Buffer[11]; + numBits = (gQueueAck[mbr.Header.TxID].Buffer[10] << 8) + gQueueAck[mbr.Header.TxID].Buffer[11]; for (i = 0; i < mbr.ByteCount; i++) { @@ -104,38 +88,9 @@ void OnModbusReceiveBits(byte buffer[]) /// void OnModbusReceiveBitsException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x01; - - gTimerModbusReadBits.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusReadBits -{ - const byte length = __size_of(struct ModbusReqRead); - const byte funcCode = 0x01; - byte buffer[length]; - struct ModbusApHeader mbap; - - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusReadBitsFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - - memcpy(buffer, gRequests[funcCode].Buffer, length); - - ModbusSend(buffer); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} - @@ -148,9 +103,6 @@ void ModbusReadRegisters(word address, word count) // 16 bit const byte funcCode = 0x03; byte buffer[length]; struct ModbusReqRead mbr; - - if (gRequests[funcCode].Count > 0) - return; ModbusMakeHeader(mbr.Header, length); // Payload @@ -159,26 +111,17 @@ void ModbusReadRegisters(word address, word count) // 16 bit mbr.Count = count; // [2] Number of items; 1:max 125=0x7D memcpy_h2n(buffer, mbr); - ModbusSend(buffer); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, length); - gRequests[funcCode].Length = length; - gTimerModbusReadRegisters.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, length, mbr.Header.TxID); } /// void OnModbusReceiveRegisters(byte buffer[]) { - const byte funcCode = 0x03; struct ModbusResReceiveRegisters mbr; word numRegs; - gTimerModbusReadRegisters.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbr, buffer); - numRegs = (gRequests[funcCode].Buffer[10] << 8) + gRequests[funcCode].Buffer[11]; + numRegs = (gQueueAck[mbr.Header.TxID].Buffer[10] << 8) + gQueueAck[mbr.Header.TxID].Buffer[11]; OnModbusReadRegistersSuccess(mbr, numRegs); } @@ -186,38 +129,9 @@ void OnModbusReceiveRegisters(byte buffer[]) /// void OnModbusReceiveRegistersException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x03; - - gTimerModbusReadRegisters.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusReadRegisters -{ - const byte length = __size_of(struct ModbusReqRead); - const byte funcCode = 0x03; - byte buffer[length]; - struct ModbusApHeader mbap; - - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusReadRegistersFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - - memcpy(buffer, gRequests[funcCode].Buffer, length); - - ModbusSend(buffer); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} - @@ -231,9 +145,6 @@ void ModbusWriteBit(word address, byte value) byte buffer[length]; struct ModbusReqWriteSingle mbw; - if (gRequests[funcCode].Count > 0) - return; - if (value >= 1) value = 0xFF; @@ -244,23 +155,14 @@ void ModbusWriteBit(word address, byte value) mbw.Value = value << 8; // [2] Output value (0x0000: Off, 0xFF00: On) memcpy_h2n(buffer, mbw); - ModbusSend(buffer); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, length); - gRequests[funcCode].Length = length; - gTimerModbusWriteBit.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, length, mbw.Header.TxID); } /// void OnModbusConfirmBit(byte buffer[]) { - const byte funcCode = 0x05; struct ModbusResConfirmSingle mbc; - gTimerModbusWriteBit.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbc, buffer); OnModbusWriteBitSuccess(mbc); @@ -269,38 +171,9 @@ void OnModbusConfirmBit(byte buffer[]) /// void OnModbusConfirmBitException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x05; - - gTimerModbusWriteBit.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusWriteBit -{ - const byte length = __size_of(struct ModbusReqWriteSingle); - const byte funcCode = 0x05; - byte buffer[length]; - struct ModbusApHeader mbap; - - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusWriteBitFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - - memcpy(buffer, gRequests[funcCode].Buffer, length); - - ModbusSend(buffer); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} - @@ -314,9 +187,6 @@ void ModbusWriteRegister(word address, int value) byte buffer[length]; struct ModbusReqWriteSingle mbw; - if (gRequests[funcCode].Count > 0) - return; - ModbusMakeHeader(mbw.Header, length); // Payload mbw.Header.FuncCode = funcCode; // [1] Function Code; 5: Write Single Register (AO) @@ -324,23 +194,14 @@ void ModbusWriteRegister(word address, int value) mbw.Value = value; // [2] Output value memcpy_h2n(buffer, mbw); - ModbusSend(buffer); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, length); - gRequests[funcCode].Length = length; - gTimerModbusWriteRegister.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, length, mbw.Header.TxID); } /// void OnModbusConfirmRegister(byte buffer[]) { - const byte funcCode = 0x06; struct ModbusResConfirmSingle mbc; - gTimerModbusWriteRegister.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbc, buffer); OnModbusWriteRegisterSuccess(mbc); @@ -349,37 +210,11 @@ void OnModbusConfirmRegister(byte buffer[]) /// void OnModbusConfirmRegisterException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x06; - - gTimerModbusWriteRegister.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusWriteRegister -{ - const byte length = __size_of(struct ModbusReqWriteSingle); - const byte funcCode = 0x06; - byte buffer[length]; - struct ModbusApHeader mbap; - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusWriteRegisterFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - memcpy(buffer, gRequests[funcCode].Buffer, length); - - ModbusSend(buffer); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} @@ -396,9 +231,6 @@ void ModbusWriteBits(word address, word count, byte values[]) byte overallLength; word i; - if (gRequests[funcCode].Count > 0) - return; - dataLength = _ceil(count / 8.0); overallLength = maxLength - 1968/8 + dataLength; ModbusMakeHeader(mbw.Header, overallLength); @@ -410,13 +242,7 @@ void ModbusWriteBits(word address, word count, byte values[]) memcpy(mbw.Data, values, dataLength); // this is 1 memcpy too much -.- memcpy_h2n(buffer, mbw); - - ModbusSend(buffer, overallLength); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, overallLength); - gRequests[funcCode].Length = overallLength; - gTimerModbusWriteBits.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, overallLength, mbw.Header.TxID); } /// @@ -462,12 +288,8 @@ void ModbusWriteBitsB(word address, word count, byte values[]) /// void OnModbusConfirmBits(byte buffer[]) { - const byte funcCode = 0x0F; struct ModbusResConfirmMultiple mbc; - gTimerModbusWriteBits.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbc, buffer); OnModbusWriteBitsSuccess(mbc); @@ -476,33 +298,10 @@ void OnModbusConfirmBits(byte buffer[]) /// void OnModbusConfirmBitsException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x0F; - - gTimerModbusWriteBits.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusWriteBits -{ - const byte funcCode = 0x0F; - struct ModbusApHeader mbap; - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusWriteBitsFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - - ModbusSend(gRequests[funcCode].Buffer, gRequests[funcCode].Length); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} @@ -519,9 +318,6 @@ void ModbusWriteRegisters(word address, word count, int values[]) word overallLength; word i; - if (gRequests[funcCode].Count > 0) - return; - dataLength = 2 * count; overallLength = maxLength - 2*123 + dataLength; @@ -536,24 +332,14 @@ void ModbusWriteRegisters(word address, word count, int values[]) mbw.Data[i] = values[i]; memcpy_h2n(buffer, mbw); - - ModbusSend(buffer, overallLength); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, overallLength); - gRequests[funcCode].Length = overallLength; - gTimerModbusWriteRegisters.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, overallLength, mbw.Header.TxID); } /// void OnModbusConfirmRegisters(byte buffer[]) { - const byte funcCode = 0x10; struct ModbusResConfirmMultiple mbc; - gTimerModbusWriteRegisters.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbc, buffer); OnModbusWriteRegistersSuccess(mbc); @@ -562,33 +348,12 @@ void OnModbusConfirmRegisters(byte buffer[]) /// void OnModbusConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x10; - - gTimerModbusWriteRegisters.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusWriteRegisters -{ - const byte funcCode = 0x10; - struct ModbusApHeader mbap; - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusWriteRegistersFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - ModbusSend(gRequests[funcCode].Buffer, gRequests[funcCode].Length); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} + // REGION: ModbusWriteMasks ------------------------------------------------------------ @@ -600,9 +365,6 @@ void ModbusWriteMasks(word address, word and, word or) byte buffer[length]; struct ModbusReqWriteMasks mbw; - if (gRequests[funcCode].Count > 0) - return; - ModbusMakeHeader(mbw.Header, length); // Payload mbw.Header.FuncCode = funcCode; // [1] Function Code; 22: Mask Write Registers (AO) @@ -611,24 +373,14 @@ void ModbusWriteMasks(word address, word and, word or) mbw.Or = or; // [2] OR mask memcpy_h2n(buffer, mbw); - - ModbusSend(buffer); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, length); - gRequests[funcCode].Length = length; - gTimerModbusWriteMasks.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, length, mbw.Header.TxID); } /// void OnModbusConfirmMasks(byte buffer[]) { - const byte funcCode = 0x15; struct ModbusResConfirmMasks mbc; - gTimerModbusWriteMasks.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbc, buffer); OnModbusWriteMasksSuccess(mbc); @@ -637,33 +389,11 @@ void OnModbusConfirmMasks(byte buffer[]) /// void OnModbusConfirmMasksException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x15; - - gTimerModbusWriteMasks.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusWriteMasks -{ - const byte funcCode = 0x16; - struct ModbusApHeader mbap; - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusWriteMasksFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - ModbusSend(gRequests[funcCode].Buffer, gRequests[funcCode].Length); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} // REGION: ModbusReadWriteRegisters ------------------------------------------------------- @@ -678,9 +408,6 @@ void ModbusReadWriteRegisters(word readAddress, word readCount, word writeAddres word overallLength; word i; - if (gRequests[funcCode].Count > 0) - return; - dataLength = 2 * writeCount; overallLength = maxLength - 2*121 + dataLength; @@ -697,27 +424,17 @@ void ModbusReadWriteRegisters(word readAddress, word readCount, word writeAddres mbw.Data[i] = values[i]; memcpy_h2n(buffer, mbw); - - ModbusSend(buffer, overallLength); - gRequests[funcCode].Count = 1; - memcpy(gRequests[funcCode].Buffer, buffer, overallLength); - gRequests[funcCode].Length = overallLength; - gTimerModbusWriteRegisters.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); + ModbusSend(buffer, overallLength, mbw.Header.TxID); } /// void OnModbusReceiveConfirmRegisters(byte buffer[]) { - const byte funcCode = 0x17; byte numRegs; struct ModbusResReceiveRegisters mbr; - - gTimerModbusReadWriteRegisters.Cancel(); - gRequests[funcCode].Count = 0; - memcpy_n2h(mbr, buffer); - numRegs = (gRequests[funcCode].Buffer[10] << 8) + gRequests[funcCode].Buffer[11]; + + numRegs = (gQueueAck[mbr.Header.TxID].Buffer[10] << 8) + gQueueAck[mbr.Header.TxID].Buffer[11]; OnModbusReadRegistersSuccess(mbr, numRegs); } @@ -725,33 +442,10 @@ void OnModbusReceiveConfirmRegisters(byte buffer[]) /// void OnModbusReceiveConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex) { - const byte funcCode = 0x17; - - gTimerModbusReadWriteRegisters.Cancel(); - gRequests[funcCode].Count = 0; - OnModbusReadBitsFailed(Exception, ex, mbap); } -/// -on timer gTimerModbusReadWriteRegisters -{ - const byte funcCode = 0x17; - struct ModbusApHeader mbap; - if (gRequests[funcCode].Count == @sysvar::Config::Modbus::MaxRetransmissionCount) - { - memcpy_n2h(mbap, gRequests[funcCode].Buffer); - OnModbusReadWriteRegistersFailed(Timeout, None, mbap); - gRequests[funcCode].Count = 0; - return; - } - - ModbusSend(gRequests[funcCode].Buffer, gRequests[funcCode].Length); - gRequests[funcCode].Count++; - this.Set(@sysvar::Config::Modbus::RequestTimeout); - ModbusRecv(); -} @@ -759,7 +453,7 @@ on timer gTimerModbusReadWriteRegisters // ------------------------------------------------------------------------------------ // REGION: OnModbusReceive ------------------------------------------------------------ -/// +/// <-OnModbusReceive> void OnModbusReceive(dword socket, long result, dword address, dword port, byte buffer[], dword size) { if (result == 0) @@ -787,7 +481,7 @@ void OnModbusReceive(dword socket, long result, dword address, dword port, byte } } -/// +/// <-OnModbusReceive> void OnModbusReceive2(byte buffer[], dword size) { struct ModbusApHeader mbap; @@ -814,12 +508,12 @@ void OnModbusReceive2(byte buffer[], dword size) if (offset != size) // Can be removed. { bin_to_strhex(buffer, str); - write("Error while going through receive buffer. Our final offset is %d, but the size of the buffer is %d! Buffer: %s", offset, size, str); + writeLineEx(0, 3, "OnModbusReceive2: Error while going through receive buffer. Our final offset is %d, but the size of the buffer is %d! Buffer: %s", offset, size, str); runError(1002, 1); } } -/// +/// <-OnModbusReceive> void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader mbap) { // Test transaction identifier? @@ -844,9 +538,18 @@ void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader } // MBAP Header is OK :) Go on + if (!gQueueSent.ContainsKey(mbap.TxID)) // We don't wait for this message! + return; + + memcpy(gQueueAck[mbap.TxID], gQueueSent[mbap.TxID]); + gQueueSent.Remove(mbap.TxID); + if (mbap.FuncCode > 0x80) // Oh no, we got a exception! { OnModbusReceive2Exceptions(buffer[offset+08], mbap); + + gQueueAck.Remove(mbap.TxID); // Remove from acknowledge queue + return; } @@ -886,9 +589,11 @@ void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader default: writeLineEx(0, 3, "We received funcCode 0x%X?", mbap.FuncCode); } + + gQueueAck.Remove(mbap.TxID); // Remove from acknowledge queue } -/// +/// <-OnModbusReceive> void OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap) { enum ModbusException ex; @@ -950,4 +655,100 @@ void OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap) OnModbusReceiveConfirmRegistersException(mbap, ex); break; } +} + + +// ------------------------------------------------------------------------------------ +// REGION: ModbusSend ----------------------------------------------------------------- +/// <-ModbusSend> +void ModbusSend(byte buffer[], word length, word TxID) +{ + struct QueueElement qe; + qe.Length = length; + memcpy(qe.Buffer, buffer, length); + + memcpy(gQueuePending[TxID], qe); + + if (gQueuePending.Size() == 1 && gQueueSent.Size() == 0) // start timer at beginning + setTimerCyclic(gtRobin, 1); + +} + +/// <-ModbusSend> +on timer gtRobin +{ + struct ModbusApHeader mbap; + struct QueueElement qe; + enum ModbusRequestError reqError; + + //writeLineEx(0, 1, "Queue Sent: %d, Queue Pending: %d, Queue Ack: %d", gQueueSent.Size(), gQueuePending.Size(), gQueueAck.Size()); + + // First: check timeouts = packets that were sent in previous run and not removed by response + for (long TxID : gQueueSent) + { + if (++gQueueSent[TxID].TimeoutTicks < @sysvar::Config::Modbus::RequestTimeout) // not timed out yet + continue; + // timed out! + if (++gQueueSent[TxID].Timeouts < @sysvar::Config::Modbus::MaxTransmissionCount) // if we may resend it + { + gQueueSent[TxID].TimeoutTicks = 0; + ModbusSnd(gQueueSent[TxID].Buffer, gQueueSent[TxID].Length); // resend it + reqError = Timeout; + ModbusRecv(); + } + else // we will NOT resend it + { + reqError = FinalTimeout; + } + + memcpy_n2h(mbap, qe.Buffer); + switch(mbap.FuncCode) // throw an error in each case + { + case ReadBits1: + case ReadBits2: + OnModbusReadBitsFailed(reqError, None, mbap); + break; + case ReadRegisters1: + case ReadRegisters2: + OnModbusReadRegistersFailed(reqError, None, mbap); + break; + case WriteBit: + OnModbusWriteBitFailed(reqError, None, mbap); + break; + case WriteRegister: + OnModbusWriteRegisterFailed(reqError, None, mbap); + break; + case WriteBits: + OnModbusWriteBitsFailed(reqError, None, mbap); + break; + case WriteRegisters: + OnModbusWriteRegistersFailed(reqError, None, mbap); + break; + case MaskRegister: + OnModbusWriteMasksFailed(reqError, None, mbap); + break; + case ReadWriteRegisters: + OnModbusReadWriteRegistersFailed(reqError, None, mbap); + break; + } + + if (reqError == FinalTimeout) // remove the packet from queue + gQueueSent.Remove(TxID); // wait until here to let the methods access the request + } + + // Second: send new packets + for (long TxID : gQueuePending) + { + if (gQueueSent.Size() > 4) // Wago 750-881 cannot handle more than 5 messages at a time :( + continue; + + ModbusSnd(gQueuePending[TxID].Buffer, gQueuePending[TxID].Length); // send packet + + memcpy(gQueueSent[TxID], gQueuePending[TxID]); // move packet to sent queue + gQueuePending.Remove(TxID); + ModbusRecv(); + } + + if (gQueueSent.Size() == 0) // Stop timer to reduce latency of first packet + this.Cancel(); } \ No newline at end of file diff --git a/Modbus/include/ModbusCommonStructs.cin b/Modbus/include/ModbusCommonStructs.cin index d13daec..017af54 100644 --- a/Modbus/include/ModbusCommonStructs.cin +++ b/Modbus/include/ModbusCommonStructs.cin @@ -105,7 +105,8 @@ variables enum ModbusRequestError { Exception, - Timeout + Timeout, + FinalTimeout }; enum ModbusException { @@ -119,4 +120,17 @@ variables GatewayPathsNA = 0x0A, TargetOffline = 0x0B }; + enum ModbusFuncCode + { + ReadBits1 = 0x01, + ReadBits2 = 0x02, + ReadRegisters1 = 0x03, + ReadRegisters2 = 0x04, + WriteBit = 0x05, + WriteRegister = 0x06, + WriteBits = 0x0F, + WriteRegisters = 0x10, + MaskRegister = 0x16, + ReadWriteRegisters = 0x17 + }; } \ No newline at end of file diff --git a/Modbus/include/ModbusFunctions.cin b/Modbus/include/ModbusFunctions.cin index d7500bc..04638f7 100644 --- a/Modbus/include/ModbusFunctions.cin +++ b/Modbus/include/ModbusFunctions.cin @@ -1,4 +1,8 @@ /*@!Encoding:1252*/ +void SysvarInit() +{ + sysSetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", ""); +} void ParseDeviceCode(word dev) { @@ -6,7 +10,6 @@ void ParseDeviceCode(word dev) byte numChannels; char modules[1024]; char module[10]; - char templ[10]; sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", modules, elCount(modules)); @@ -17,13 +20,13 @@ void ParseDeviceCode(word dev) if (dev & 0x0001) // Input Module { input = 1; - strncpy(templ, "DI%d,", elCount(templ)); + strncpy(module, "DI%d,", elCount(module)); @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits += numChannels; } else if (dev & 0x0002) // Output Module { input = 0; - strncpy(templ, "DO%d,", elCount(templ)); + strncpy(module, "DO%d,", elCount(module)); @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputBits += numChannels; } else // blööd @@ -31,11 +34,6 @@ void ParseDeviceCode(word dev) writeLineEx(0, 3, "<%NODE_NAME%> Device code 0x%X cannot be decoded", dev); runError(1003, 1); } - - snprintf(module, elCount(module), templ, numChannels); - strncat(modules, module, elCount(modules)); - sysSetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", modules); - writeLineEx(0, 1, "<%NODE_NAME%> 0x%X - %s", dev, module); } else { @@ -48,18 +46,23 @@ void ParseDeviceCode(word dev) numChannels = 2; break; default: // unknown device. Ouch! - writeLineEx(0, 2, "<%NODE_NAME%> Connected device: 750-%X", dev); + writeLineEx(0, 2, "<%NODE_NAME%> Connected device: 750-%d", dev); return; } if (input) { - strncpy(templ, "AI%d,", elCount(templ)); + strncpy(module, "AI%d,", elCount(module)); @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters += numChannels; } else { - strncpy(templ, "AO%d,", elCount(templ)); + strncpy(module, "AO%d,", elCount(module)); @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputRegisters += numChannels; } } + + snprintf(module, elCount(module), module, numChannels); + strncat(modules, module, elCount(modules)); + sysSetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", modules); + writeLineEx(0, 1, "<%NODE_NAME%> 0x%X -> %s", dev, module); } \ No newline at end of file diff --git a/Modbus/include/ModbusTcpClientCommon.cin b/Modbus/include/ModbusTcpClientCommon.cin index 365d483..8ab9fc2 100644 --- a/Modbus/include/ModbusTcpClientCommon.cin +++ b/Modbus/include/ModbusTcpClientCommon.cin @@ -8,15 +8,10 @@ includes void ModbusConnectTo(char Remote_IP[], word Remote_Port) { - TcpConnectTo("192.168.1.3", 502); + TcpConnectTo(Remote_IP, Remote_Port); } -void ModbusSend(byte buffer[]) -{ - TcpSnd(buffer, elCount(buffer)); -} - -void ModbusSend(byte buffer[], word length) +void ModbusSnd(byte buffer[], word length) { TcpSnd(buffer, length); } diff --git a/Modbus/include/ModbusUdpClientCommon.cin b/Modbus/include/ModbusUdpClientCommon.cin index d7705d5..88a4f1a 100644 --- a/Modbus/include/ModbusUdpClientCommon.cin +++ b/Modbus/include/ModbusUdpClientCommon.cin @@ -8,15 +8,10 @@ includes void ModbusConnectTo(char Remote_IP[], word Remote_Port) { - UdpConnectTo("192.168.1.3", 502); + UdpConnectTo(Remote_IP, Remote_Port); } -void ModbusSend(byte buffer[]) -{ - UdpSnd(buffer, elCount(buffer)); -} - -void ModbusSend(byte buffer[], word length) +void ModbusSnd(byte buffer[], word length) { UdpSnd(buffer, length); } diff --git a/Modbus/include/TcpCommon.cin b/Modbus/include/TcpCommon.cin index d394ae2..0a81980 100644 --- a/Modbus/include/TcpCommon.cin +++ b/Modbus/include/TcpCommon.cin @@ -8,8 +8,6 @@ includes variables { TcpSocket gSocket; - - byte gRxBuffer[8192]; } @@ -21,20 +19,14 @@ word TcpOpenSocket() dword i = 0; CHAR errorText[200]; - localIp = SetupIp(Local_IP); - - if (localIp == INVALID_IP) - return INVALID_IP; - // Try to open socket do { - localPort = random(65536-10240)+10240; - gSocket = TcpSocket::Open(localIp, localPort); + gSocket = TcpSocket::Open(0, 0); if (gSocket.GetLastSocketError() != 0) { gSocket.GetLastSocketErrorAsString(errorText, elcount(errorText)); - writeLineEx(0, 1, "<%NODE_NAME%> Error: could not open Tcp socket on %s:%d, %s (%d)!", Local_IP, localPort, errorText, gSocket.GetLastSocketError()); + writeLineEx(0, 1, "<%NODE_NAME%> Error: could not open Tcp socket: %s (%d)!", errorText, gSocket.GetLastSocketError()); } } while (gSocket.GetLastSocketError() != 0 && i++ < 9); @@ -46,7 +38,7 @@ word TcpOpenSocket() } else { - writeLineEx(0, 1, "<%NODE_NAME%> Tcp socket opened on %s:%d.", Local_IP, localPort); + writeLineEx(0, 1, "<%NODE_NAME%> Tcp socket opened."); } return 0; diff --git a/Modbus/include/TcpUdpCommon.cin b/Modbus/include/TcpUdpCommon.cin index d9cf84b..b90703f 100644 --- a/Modbus/include/TcpUdpCommon.cin +++ b/Modbus/include/TcpUdpCommon.cin @@ -14,6 +14,8 @@ variables dword gRemoteIP = INVALID_IP; word gRemotePort = 0; + + byte gRxBuffer[8192]; } // Not needed diff --git a/Modbus/include/UdpCommon.cin b/Modbus/include/UdpCommon.cin index ea2d4ed..cd6e661 100644 --- a/Modbus/include/UdpCommon.cin +++ b/Modbus/include/UdpCommon.cin @@ -8,14 +8,12 @@ includes variables { UdpSocket gSocket; - - byte gRxBuffer[8192]; } word UdpOpenSocket() { - dword i = 0; + byte i; CHAR errorText[200]; if (EthGetAdapterStatus() != 2) // Not connected @@ -25,6 +23,7 @@ word UdpOpenSocket() } // Try to open socket + i = 0; do { gSocket = UdpSocket::Open(0, 0); // Open socket on any IP and Port @@ -34,7 +33,7 @@ word UdpOpenSocket() writeLineEx(0, 1, "<%NODE_NAME%> Error: could not open Udp socket: %s (%d)!", errorText, gSocket.GetLastSocketError()); } } - while (gSocket.GetLastSocketError() != 0 && i++ < 9); + while (gSocket.GetLastSocketError() != 0 && i++ < 5); if (gSocket.GetLastSocketError() != 0) { @@ -93,7 +92,7 @@ void UdpRecv() return; } - result = gSocket.ReceiveFrom(gRxBuffer, elcount(gRxBuffer)); + result = gSocket.ReceiveFrom(gRxBuffer, elCount(gRxBuffer)); if (result != 0) // Calling OnUdpReceive otherwise { @@ -101,8 +100,8 @@ void UdpRecv() if (gIpLastErr != WSA_IO_PENDING) // Calling OnUdpReceive otherwise { - gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); - writeLineEx(0, 2, "<%NODE_NAME%> UdpRecv Error (%d): %s", gIpLastErr, gIpLastErrStr); + gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elCount(gIpLastErrStr)); + writeLineEx(0, 2, "<%NODE_NAME%> UdpReceiveFrom Error (%d): %s", gIpLastErr, gIpLastErrStr); gSocket.Close(); gSocketState = CLOSED; } diff --git a/Modbus/modbus.cfg b/Modbus/modbus.cfg index d163996..f4a144d 100644 --- a/Modbus/modbus.cfg +++ b/Modbus/modbus.cfg @@ -1,17 +1,17 @@ -;CANoe Version |4|7|1|42353 modbus +;CANoe Version |4|7|1|42356 modbus Version: 8.2.40 Build 40 32 PRO 10 -APPDIR Vector.CANoe.Debugger.DLL -Vector.CANoe.Debugger, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null -Vector.CANoe.Debugger.DebuggerComponent -1 -1.0.0 APPDIR Vector.CANoe.SignalGenerators.DLL Vector.CANoe.SignalGenerators, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null Vector.CANoe.SignalGenerators.ComponentWrapper -2 +1 1.0.1 +APPDIR Vector.CANoe.Debugger.DLL +Vector.CANoe.Debugger, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null +Vector.CANoe.Debugger.DebuggerComponent +2 +1.0.0 VGlobalConfiguration 1 Begin_Of_Object 17 VGlobalParameters 2 Begin_Of_Object @@ -425,15 +425,15 @@ VCaplOptionsStreamer 3 Begin_Of_Object End_Of_Object VCaplOptionsStreamer 3 VSVConfigurationStreamer 3 Begin_Of_Object 1 -1713 +1710 - + @@ -443,7 +443,7 @@ VSVConfigurationStreamer 3 Begin_Of_Object 2 1 - 1 "..\Modbus\modbus.vsysvar" + 1 "modbus.vsysvar" 1 End_Of_Object VSVConfigurationStreamer 3 @@ -3438,7 +3438,7 @@ VTraceControlFixedModeExpansionItems 15 Begin_Of_Object 0 End_Of_Object VTraceControlFixedModeExpansionItems 15 14 -J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus - preStack +J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus End_Of_Serialized_Data 14 14 Trace Window @@ -3863,151 +3863,7 @@ End_Of_Object VBoxRoot 15 End_Of_Object VDataBox 14 1 6 -14 -VSysVarObject 14 Begin_Of_Object -1 -VHostSignal 15 Begin_Of_Object -2 -3 -IP -0 -End_Of_Object VHostSignal 15 -14 -ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object -1 -VConfigSysVar 18 Begin_Of_Object -1 -VConfigEvent 19 Begin_Of_Object -1 -End_Of_Object VConfigEvent 19 -Ethernet::ModbusClientUDP.can::Info -IP -End_Of_Object VConfigSysVar 18 -End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 -End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 --1 -2 -End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 - -End_Of_Serialized_Data 14 -End_Of_Object VSysVarObject 14 -[Begin_of_Item] -2 1 -1 8 2 0 0 16777215 --1000 1000 -1000 0 -[End_of_Item] -VSysVarObject 14 Begin_Of_Object -1 -VHostSignal 15 Begin_Of_Object -2 -3 -Port -0 -End_Of_Object VHostSignal 15 -14 -ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object -1 -VConfigSysVar 18 Begin_Of_Object -1 -VConfigEvent 19 Begin_Of_Object -1 -End_Of_Object VConfigEvent 19 -Ethernet::ModbusClientUDP.can::Info -Port -End_Of_Object VConfigSysVar 18 -End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 -End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 --1 -2 -End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 - -End_Of_Serialized_Data 14 -End_Of_Object VSysVarObject 14 -[Begin_of_Item] -2 2 -1 1 2 0 0 16777215 --1000 1000 -1000 0 -[End_of_Item] -VSysVarObject 14 Begin_Of_Object -1 -VHostSignal 15 Begin_Of_Object -2 -3 -SerialCode -0 -End_Of_Object VHostSignal 15 -14 -ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object -1 -VConfigSysVar 18 Begin_Of_Object -1 -VConfigEvent 19 Begin_Of_Object -1 -End_Of_Object VConfigEvent 19 -Ethernet::ModbusClientUDP.can::Info -SerialCode -End_Of_Object VConfigSysVar 18 -End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 -End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 --1 -2 -End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 - -End_Of_Serialized_Data 14 -End_Of_Object VSysVarObject 14 -[Begin_of_Item] -2 3 -1 1 2 0 0 16777215 --1000 1000 -1000 0 -[End_of_Item] -VSysVarObject 14 Begin_Of_Object -1 -VHostSignal 15 Begin_Of_Object -2 -3 -DeviceCode -0 -End_Of_Object VHostSignal 15 -14 -ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object -1 -VConfigSysVar 18 Begin_Of_Object -1 -VConfigEvent 19 Begin_Of_Object -1 -End_Of_Object VConfigEvent 19 -Ethernet::ModbusClientUDP.can::Info -DeviceCode -End_Of_Object VConfigSysVar 18 -End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 -End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 --1 -2 -End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 - -End_Of_Serialized_Data 14 -End_Of_Object VSysVarObject 14 -[Begin_of_Item] -2 14 -1 1 2 0 0 16777215 --1000 1000 -1000 0 -[End_of_Item] +12 VSysVarObject 14 Begin_Of_Object 1 VHostSignal 15 Begin_Of_Object @@ -4040,80 +3896,8 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 4 -1 8 2 0 0 16777215 --1000 1000 -1000 0 -[End_of_Item] -VSysVarObject 14 Begin_Of_Object -1 -VHostSignal 15 Begin_Of_Object -2 -3 -Bits -0 -End_Of_Object VHostSignal 15 -14 -ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object -1 -VConfigSysVar 18 Begin_Of_Object -1 -VConfigEvent 19 Begin_Of_Object -1 -End_Of_Object VConfigEvent 19 -Ethernet1::Wago_3::Data -Bits -End_Of_Object VConfigSysVar 18 -End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 -End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 --1 -2 -End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 - -End_Of_Serialized_Data 14 -End_Of_Object VSysVarObject 14 -[Begin_of_Item] -2 13 -1 32 2 0 0 16777215 --1000 1000 -1000 0 -[End_of_Item] -VSysVarObject 14 Begin_Of_Object -1 -VHostSignal 15 Begin_Of_Object -2 -3 -Registers -0 -End_Of_Object VHostSignal 15 -14 -ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object -1 -ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object -1 -VConfigSysVar 18 Begin_Of_Object -1 -VConfigEvent 19 Begin_Of_Object -1 -End_Of_Object VConfigEvent 19 -Ethernet1::Wago_3::Data -Registers -End_Of_Object VConfigSysVar 18 -End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 -End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 --1 -2 -End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 - -End_Of_Serialized_Data 14 -End_Of_Object VSysVarObject 14 -[Begin_of_Item] -2 12 -1 32 2 0 0 16777215 +2 1 +1 8 0 0 0 16777215 -1000 1000 -1000 0 [End_of_Item] VSysVarObject 14 Begin_Of_Object @@ -4148,7 +3932,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 6 +2 3 1 1 2 0 0 16777215 1 10000 1 0 [End_of_Item] @@ -4184,7 +3968,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 5 +2 2 1 1 2 0 0 16777215 1 10000 1 0 [End_of_Item] @@ -4220,7 +4004,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 11 +2 7 1 1 2 0 0 16777215 0 2000 0 0 [End_of_Item] @@ -4256,7 +4040,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 10 +2 8 1 1 2 0 0 16777215 0 2000 0 0 [End_of_Item] @@ -4292,7 +4076,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 9 +2 6 1 1 2 0 0 16777215 0 123 0 0 [End_of_Item] @@ -4328,7 +4112,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 8 +2 5 1 1 2 0 0 16777215 0 123 0 0 [End_of_Item] @@ -4364,10 +4148,154 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 End_Of_Serialized_Data 14 End_Of_Object VSysVarObject 14 [Begin_of_Item] -2 7 +2 4 1 8 2 0 0 16777215 -1000 1000 -1000 0 [End_of_Item] +VSysVarObject 14 Begin_Of_Object +1 +VHostSignal 15 Begin_Of_Object +2 +3 +Ethernet1::Wago_3::Data::OutputBits +0 +End_Of_Object VHostSignal 15 +14 +ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object +1 +VConfigSysVar 18 Begin_Of_Object +1 +VConfigEvent 19 Begin_Of_Object +1 +End_Of_Object VConfigEvent 19 +Ethernet1::Wago_3::Data +OutputBits +End_Of_Object VConfigSysVar 18 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 +-1 +2 +End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 + +End_Of_Serialized_Data 14 +End_Of_Object VSysVarObject 14 +[Begin_of_Item] +2 13 +1 32 2 0 0 16777215 +-1000 1000 -1000 0 +[End_of_Item] +VSysVarObject 14 Begin_Of_Object +1 +VHostSignal 15 Begin_Of_Object +2 +3 +Ethernet1::Wago_3::Data::InputRegisters +0 +End_Of_Object VHostSignal 15 +14 +ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object +1 +VConfigSysVar 18 Begin_Of_Object +1 +VConfigEvent 19 Begin_Of_Object +1 +End_Of_Object VConfigEvent 19 +Ethernet1::Wago_3::Data +InputRegisters +End_Of_Object VConfigSysVar 18 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 +-1 +2 +End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 + +End_Of_Serialized_Data 14 +End_Of_Object VSysVarObject 14 +[Begin_of_Item] +2 12 +1 32 2 0 0 16777215 +-1000 1000 -1000 0 +[End_of_Item] +VSysVarObject 14 Begin_Of_Object +1 +VHostSignal 15 Begin_Of_Object +2 +3 +Ethernet1::Wago_3::Data::InputBits +0 +End_Of_Object VHostSignal 15 +14 +ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object +1 +VConfigSysVar 18 Begin_Of_Object +1 +VConfigEvent 19 Begin_Of_Object +1 +End_Of_Object VConfigEvent 19 +Ethernet1::Wago_3::Data +InputBits +End_Of_Object VConfigSysVar 18 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 +-1 +2 +End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 + +End_Of_Serialized_Data 14 +End_Of_Object VSysVarObject 14 +[Begin_of_Item] +2 11 +1 32 2 0 0 16777215 +-1000 1000 -1000 0 +[End_of_Item] +VSysVarObject 14 Begin_Of_Object +1 +VHostSignal 15 Begin_Of_Object +2 +3 +Ethernet1::Wago_3::Data::OutputRegisters +0 +End_Of_Object VHostSignal 15 +14 +ValueObjectConfiguration::VConfiguredSysVar 15 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 Begin_Of_Object +1 +ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 Begin_Of_Object +1 +VConfigSysVar 18 Begin_Of_Object +1 +VConfigEvent 19 Begin_Of_Object +1 +End_Of_Object VConfigEvent 19 +Ethernet1::Wago_3::Data +OutputRegisters +End_Of_Object VConfigSysVar 18 +End_Of_Object ValueObjectConfiguration::Detail::AbstractConfiguredValueObject 17 +End_Of_Object ValueObjectConfiguration::Detail::VConfiguredValueObjectBase 16 +-1 +2 +End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15 + +End_Of_Serialized_Data 14 +End_Of_Object VSysVarObject 14 +[Begin_of_Item] +2 10 +1 32 2 0 0 16777215 +-1000 1000 -1000 0 +[End_of_Item] 20 308 16 169 75 75 50 100 100 100 1 35 35 30 @@ -4507,7 +4435,7 @@ VUniqueBox 4 Begin_Of_Object VBoxRoot 5 Begin_Of_Object 1 3 -0 0 0 1 -1 -1 -1 -1 0 0 890 487 +0 0 0 1 -1 -1 -8 -30 0 0 890 487 1 @@ -4515,7 +4443,7 @@ MDI_DOCK_INFO_END 5 1 6 -0 1 -1 -1 -1 -1 0 0 890 487 +0 1 -1 -1 -8 -30 0 0 890 487 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 -1 32767 0 0 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 0 0 END_OF_DOCK_INFO 1 @@ -4596,7 +4524,7 @@ VConfigurationRoot 8 Begin_Of_Object End_Of_Object VConfigurationRoot 8 1 "ModbusClientUDP.can" 1 -J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus - preStack\ModbusClientUDP.cbf +J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus\ModbusClientUDP.cbf Wago_3 modbus 5 @@ -4614,13 +4542,15 @@ Wago_3 1 0 0 0 SS_BEGIN_COMMON_INFO 1 -4 +5 Behavior 1 Buses 1 Misc 1 +Modules +1 Timing 1 SS_END_COMMON_INFO @@ -4964,7 +4894,7 @@ End_Of_Serialized_Data 7 End_Of_Object VProgrammedNode 7 0 0 -Startdelay 0 0 0 +Startdelay 1 0 10 Jitter 0 0 1 0 0 0 0 1 1 ETHERNET_IL.DLL @@ -4980,7 +4910,7 @@ VSimulinkModelViewerConfiguration 7 Begin_Of_Object End_Of_Object VSimulinkModelViewerConfiguration 7 1 0 -1861272737 +3870015388 0 NodeSignalPanelBustypeCount 0 End_Of_Object VSimulationNode 6 @@ -5235,7 +5165,7 @@ NULL End_Of_Object VDOLocalInfoStruct 3 0.000000 0 0 -1 1 0 59420 1 233 1 2882400001 323 556 331 782 2882400002 0 0 0 0 0 0 1 2882400001 1197 1197 333 333 2882400002 0 0 0 1809669784 0 0 3 +1 1 0 59420 1 233 1 2882400001 323 556 331 782 2882400002 0 0 0 0 0 0 1 2882400001 1197 1197 333 333 2882400002 0 0 0 339858776 0 339006412 3 SS_BEGIN_COMMON_INFO 1 0 @@ -5247,7 +5177,7 @@ Ether1 11 1 1 -338794296 1 0 1 0 1 1 0 0 0 2000 1 +339044032 1 0 1 0 1 1 0 0 0 2000 1 SS_BEGIN_COMMON_INFO 1 3 @@ -5649,12 +5579,12 @@ SymbSelHeaderMgrBegin SymbSelHeaderMgrEnd End Begin -3 0 -1 +3 0 18 2 modbus Systemvariablen - ( 0 ) + ( 2 ( 1 ( 0 ) 2 ( 0 ) 0 ) 3 ( 1 ( 1 ( 0 ) 2 ( 0 ) 0 ) 0 ) 0 ) SymbSelHeaderMgrBegin 1 4 0 1 200 0 0 diff --git a/Modbus/modbus.vsysvar b/Modbus/modbus.vsysvar index db91fe4..7fc791f 100644 --- a/Modbus/modbus.vsysvar +++ b/Modbus/modbus.vsysvar @@ -5,19 +5,22 @@ + + - - - + + + +