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 :)
This commit is contained in:
Jonny007-MKD 2014-05-21 11:26:45 +00:00
parent 73e18085c3
commit dde6cef26f
11 changed files with 405 additions and 695 deletions

View file

@ -11,6 +11,7 @@ variables
char gNodeName[10] = "ClientUDP"; char gNodeName[10] = "ClientUDP";
msTimer muster, clock; msTimer muster, clock;
msTimer gtRead;
byte gX[2] = {1, 0}; byte gX[2] = {1, 0};
enum MbClientState {INIT, ConfWago1, ConfWago2, ConfWago3, ConfWago4, ConfWago5, ConfWago6, DATA}; enum MbClientState {INIT, ConfWago1, ConfWago2, ConfWago3, ConfWago4, ConfWago5, ConfWago6, DATA};
@ -22,18 +23,22 @@ variables
on preStart on preStart
{ {
writeClear(0); writeClear(0);
setStartdelay(10);
} }
on start on start
{ {
char ip[16]; ModbusInit();
sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config", "IP", ip, elCount(ip)); SysvarInit();
ModbusInit(ip, @sysvar::Config::Modbus::Port);
// Read serial code, additional stuff is done in OnModbusReceiveRegisters // Read serial code, additional stuff is done in OnModbusReceiveRegisters
gState = ConfWago1; gState = ConfWago1;
ModbusReadRegisters(0x2011, 1); 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]; char str[20*5];
long fehler; long fehler;
byte i; 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]; @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::SerialCode = mbr.Data[0];
gState = ConfWago2;
ModbusReadRegisters(0x2012, 1);
break; break;
case ConfWago2: case 0x2012:
@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::DeviceCode = mbr.Data[0]; @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::DeviceCode = mbr.Data[0];
gState = ConfWago3;
ModbusReadRegisters(0x2030, 65);
break; break;
case ConfWago3: case 0x2030:
case 0x2031:
case 0x2032:
case 0x2033:
for (i = 0; i < 65; i++) for (i = 0; i < 65; i++)
{ {
if (mbr.Data[i] == 0x0000) if (mbr.Data[i] == 0x0000)
@ -99,55 +109,11 @@ void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbr, word num
} }
ParseDeviceCode(mbr.Data[i]); 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; break;
default: default:
// Do everything else here // Do everything else here
dbin_to_strhex(mbr.Data, str); 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; break;
} }
} }
@ -173,9 +139,19 @@ void OnModbusWriteMasksSuccess(struct ModbusResConfirmMasks mbc)
// Key events ------------------------------------------------------------------------- // 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 on key 'r' // read the first bits
{ {
ModbusReadBits(0, 51); ModbusReadBits(0, 51);
@ -308,4 +284,4 @@ on timer clock
x[0] = (s & 0x01) | (s & 0x02) | ((s & 0x04) << 1) | ((s & 0x08) << 4); x[0] = (s & 0x01) | (s & 0x02) | ((s & 0x04) << 1) | ((s & 0x08) << 4);
x[1] = (s & 0x10) << 3; x[1] = (s & 0x10) << 3;
ModbusWriteBits(0, 16, x); ModbusWriteBits(0, 16, x);
} }

View file

@ -8,38 +8,34 @@ includes
variables variables
{ {
const word gMaxPacketLength = __size_of(struct ModbusReqWriteRegisters); 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 // Global storage for pending and sent requests, associated by TxID
struct struct QueueElement
{ {
byte Count; word TimeoutTicks;
byte Timeouts;
word Length; word Length;
byte Buffer[gMaxPacketLength]; byte Buffer[gMaxPacketLength];
} gRequests[int64, 8]; };
struct QueueElement gQueuePending[long, 2];
struct QueueElement gQueueSent[long, 2];
struct QueueElement gQueueAck[long, 2];
msTimer gTimerModbusReadBits;
msTimer gTimerModbusReadRegisters;
msTimer gTimerModbusWriteBit;
msTimer gTimerModbusWriteRegister;
msTimer gTimerModbusWriteBits;
msTimer gTimerModbusWriteRegisters;
msTimer gTimerModbusWriteMasks;
msTimer gTimerModbusReadWriteRegisters;
} }
void ModbusInit(char Remote_IP[], word Remote_Port) void ModbusInit()
{ {
sysDefineVariableString("%NETWORK_NAME%::%NODE_NAME%::Info", "IP", Remote_IP); char ip[16];
sysDefineVariableInt("%NETWORK_NAME%::%NODE_NAME%::Info", "Port", Remote_Port); sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Config", "IP", ip, elCount(ip));
ModbusConnectTo(Remote_IP, Remote_Port); ModbusConnectTo(ip, @sysvar::Config::Modbus::Port);
} }
void ModbusMakeHeader(struct ModbusApHeader mbap, word length) 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.Protocol = 0x0000; // [2] Protocol ID = 0 = Modbus
mbap.Length = length - __offset_of(struct ModbusApHeader, UnitID); // [2] Length; Number of bytes following mbap.Length = length - __offset_of(struct ModbusApHeader, UnitID); // [2] Length; Number of bytes following
mbap.UnitID = 0xFF; // [1] Unit identifier; not relevant mbap.UnitID = 0xFF; // [1] Unit identifier; not relevant
@ -56,9 +52,6 @@ void ModbusReadBits(word address, word count)
byte buffer[length]; byte buffer[length];
struct ModbusReqRead mbr; struct ModbusReqRead mbr;
if (gRequests[funcCode].Count > 0) // TODO: a transmission is in progress. What shall we do?
return;
ModbusMakeHeader(mbr.Header, length); ModbusMakeHeader(mbr.Header, length);
// Payload // 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 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 mbr.Count = count; // [2] Number of items; 1:max 2000=0x7D0
memcpy_h2n(buffer, mbr); memcpy_h2n(buffer, mbr);
ModbusSend(buffer); ModbusSend(buffer, length, mbr.Header.TxID);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, length);
gRequests[funcCode].Length = length;
gTimerModbusReadBits.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusReadBits> /// <ModbusReadBits>
void OnModbusReceiveBits(byte buffer[]) void OnModbusReceiveBits(byte buffer[])
{ {
const byte funcCode = 0x01;
struct ModbusResReceiveBits mbr; struct ModbusResReceiveBits mbr;
byte bitStatus[1968]; byte bitStatus[1968];
word numBits; word numBits;
byte i, j; byte i, j;
gTimerModbusReadBits.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbr, buffer); 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++) for (i = 0; i < mbr.ByteCount; i++)
{ {
@ -104,38 +88,9 @@ void OnModbusReceiveBits(byte buffer[])
/// <ModbusReadBits> /// <ModbusReadBits>
void OnModbusReceiveBitsException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusReceiveBitsException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x01;
gTimerModbusReadBits.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusReadBits>
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; const byte funcCode = 0x03;
byte buffer[length]; byte buffer[length];
struct ModbusReqRead mbr; struct ModbusReqRead mbr;
if (gRequests[funcCode].Count > 0)
return;
ModbusMakeHeader(mbr.Header, length); ModbusMakeHeader(mbr.Header, length);
// Payload // Payload
@ -159,26 +111,17 @@ void ModbusReadRegisters(word address, word count) // 16 bit
mbr.Count = count; // [2] Number of items; 1:max 125=0x7D mbr.Count = count; // [2] Number of items; 1:max 125=0x7D
memcpy_h2n(buffer, mbr); memcpy_h2n(buffer, mbr);
ModbusSend(buffer); ModbusSend(buffer, length, mbr.Header.TxID);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, length);
gRequests[funcCode].Length = length;
gTimerModbusReadRegisters.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusReadRegisters> /// <ModbusReadRegisters>
void OnModbusReceiveRegisters(byte buffer[]) void OnModbusReceiveRegisters(byte buffer[])
{ {
const byte funcCode = 0x03;
struct ModbusResReceiveRegisters mbr; struct ModbusResReceiveRegisters mbr;
word numRegs; word numRegs;
gTimerModbusReadRegisters.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbr, buffer); 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); OnModbusReadRegistersSuccess(mbr, numRegs);
} }
@ -186,38 +129,9 @@ void OnModbusReceiveRegisters(byte buffer[])
/// <ModbusReadRegisters> /// <ModbusReadRegisters>
void OnModbusReceiveRegistersException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusReceiveRegistersException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x03;
gTimerModbusReadRegisters.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusReadRegisters>
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]; byte buffer[length];
struct ModbusReqWriteSingle mbw; struct ModbusReqWriteSingle mbw;
if (gRequests[funcCode].Count > 0)
return;
if (value >= 1) if (value >= 1)
value = 0xFF; value = 0xFF;
@ -244,23 +155,14 @@ void ModbusWriteBit(word address, byte value)
mbw.Value = value << 8; // [2] Output value (0x0000: Off, 0xFF00: On) mbw.Value = value << 8; // [2] Output value (0x0000: Off, 0xFF00: On)
memcpy_h2n(buffer, mbw); memcpy_h2n(buffer, mbw);
ModbusSend(buffer); ModbusSend(buffer, length, mbw.Header.TxID);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, length);
gRequests[funcCode].Length = length;
gTimerModbusWriteBit.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusWriteBit> /// <ModbusWriteBit>
void OnModbusConfirmBit(byte buffer[]) void OnModbusConfirmBit(byte buffer[])
{ {
const byte funcCode = 0x05;
struct ModbusResConfirmSingle mbc; struct ModbusResConfirmSingle mbc;
gTimerModbusWriteBit.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbc, buffer); memcpy_n2h(mbc, buffer);
OnModbusWriteBitSuccess(mbc); OnModbusWriteBitSuccess(mbc);
@ -269,38 +171,9 @@ void OnModbusConfirmBit(byte buffer[])
/// <ModbusWriteBit> /// <ModbusWriteBit>
void OnModbusConfirmBitException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusConfirmBitException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x05;
gTimerModbusWriteBit.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusWriteBit>
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]; byte buffer[length];
struct ModbusReqWriteSingle mbw; struct ModbusReqWriteSingle mbw;
if (gRequests[funcCode].Count > 0)
return;
ModbusMakeHeader(mbw.Header, length); ModbusMakeHeader(mbw.Header, length);
// Payload // Payload
mbw.Header.FuncCode = funcCode; // [1] Function Code; 5: Write Single Register (AO) 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 mbw.Value = value; // [2] Output value
memcpy_h2n(buffer, mbw); memcpy_h2n(buffer, mbw);
ModbusSend(buffer); ModbusSend(buffer, length, mbw.Header.TxID);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, length);
gRequests[funcCode].Length = length;
gTimerModbusWriteRegister.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusWriteRegister> /// <ModbusWriteRegister>
void OnModbusConfirmRegister(byte buffer[]) void OnModbusConfirmRegister(byte buffer[])
{ {
const byte funcCode = 0x06;
struct ModbusResConfirmSingle mbc; struct ModbusResConfirmSingle mbc;
gTimerModbusWriteRegister.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbc, buffer); memcpy_n2h(mbc, buffer);
OnModbusWriteRegisterSuccess(mbc); OnModbusWriteRegisterSuccess(mbc);
@ -349,37 +210,11 @@ void OnModbusConfirmRegister(byte buffer[])
/// <ModbusWriteRegister> /// <ModbusWriteRegister>
void OnModbusConfirmRegisterException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusConfirmRegisterException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x06;
gTimerModbusWriteRegister.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusWriteRegister>
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; byte overallLength;
word i; word i;
if (gRequests[funcCode].Count > 0)
return;
dataLength = _ceil(count / 8.0); dataLength = _ceil(count / 8.0);
overallLength = maxLength - 1968/8 + dataLength; overallLength = maxLength - 1968/8 + dataLength;
ModbusMakeHeader(mbw.Header, overallLength); 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(mbw.Data, values, dataLength); // this is 1 memcpy too much -.-
memcpy_h2n(buffer, mbw); memcpy_h2n(buffer, mbw);
ModbusSend(buffer, overallLength, mbw.Header.TxID);
ModbusSend(buffer, overallLength);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, overallLength);
gRequests[funcCode].Length = overallLength;
gTimerModbusWriteBits.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusWriteBits> /// <ModbusWriteBits>
@ -462,12 +288,8 @@ void ModbusWriteBitsB(word address, word count, byte values[])
/// <ModbusWriteBits> /// <ModbusWriteBits>
void OnModbusConfirmBits(byte buffer[]) void OnModbusConfirmBits(byte buffer[])
{ {
const byte funcCode = 0x0F;
struct ModbusResConfirmMultiple mbc; struct ModbusResConfirmMultiple mbc;
gTimerModbusWriteBits.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbc, buffer); memcpy_n2h(mbc, buffer);
OnModbusWriteBitsSuccess(mbc); OnModbusWriteBitsSuccess(mbc);
@ -476,33 +298,10 @@ void OnModbusConfirmBits(byte buffer[])
/// <ModbusWriteBits> /// <ModbusWriteBits>
void OnModbusConfirmBitsException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusConfirmBitsException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x0F;
gTimerModbusWriteBits.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusWriteBits>
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 overallLength;
word i; word i;
if (gRequests[funcCode].Count > 0)
return;
dataLength = 2 * count; dataLength = 2 * count;
overallLength = maxLength - 2*123 + dataLength; overallLength = maxLength - 2*123 + dataLength;
@ -536,24 +332,14 @@ void ModbusWriteRegisters(word address, word count, int values[])
mbw.Data[i] = values[i]; mbw.Data[i] = values[i];
memcpy_h2n(buffer, mbw); memcpy_h2n(buffer, mbw);
ModbusSend(buffer, overallLength, mbw.Header.TxID);
ModbusSend(buffer, overallLength);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, overallLength);
gRequests[funcCode].Length = overallLength;
gTimerModbusWriteRegisters.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusWriteRegisters> /// <ModbusWriteRegisters>
void OnModbusConfirmRegisters(byte buffer[]) void OnModbusConfirmRegisters(byte buffer[])
{ {
const byte funcCode = 0x10;
struct ModbusResConfirmMultiple mbc; struct ModbusResConfirmMultiple mbc;
gTimerModbusWriteRegisters.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbc, buffer); memcpy_n2h(mbc, buffer);
OnModbusWriteRegistersSuccess(mbc); OnModbusWriteRegistersSuccess(mbc);
@ -562,33 +348,12 @@ void OnModbusConfirmRegisters(byte buffer[])
/// <ModbusWriteRegisters> /// <ModbusWriteRegisters>
void OnModbusConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x10;
gTimerModbusWriteRegisters.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusWriteRegisters>
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 ------------------------------------------------------------ // REGION: ModbusWriteMasks ------------------------------------------------------------
@ -600,9 +365,6 @@ void ModbusWriteMasks(word address, word and, word or)
byte buffer[length]; byte buffer[length];
struct ModbusReqWriteMasks mbw; struct ModbusReqWriteMasks mbw;
if (gRequests[funcCode].Count > 0)
return;
ModbusMakeHeader(mbw.Header, length); ModbusMakeHeader(mbw.Header, length);
// Payload // Payload
mbw.Header.FuncCode = funcCode; // [1] Function Code; 22: Mask Write Registers (AO) 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 mbw.Or = or; // [2] OR mask
memcpy_h2n(buffer, mbw); memcpy_h2n(buffer, mbw);
ModbusSend(buffer, length, mbw.Header.TxID);
ModbusSend(buffer);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, length);
gRequests[funcCode].Length = length;
gTimerModbusWriteMasks.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusWriteMasks> /// <ModbusWriteMasks>
void OnModbusConfirmMasks(byte buffer[]) void OnModbusConfirmMasks(byte buffer[])
{ {
const byte funcCode = 0x15;
struct ModbusResConfirmMasks mbc; struct ModbusResConfirmMasks mbc;
gTimerModbusWriteMasks.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbc, buffer); memcpy_n2h(mbc, buffer);
OnModbusWriteMasksSuccess(mbc); OnModbusWriteMasksSuccess(mbc);
@ -637,33 +389,11 @@ void OnModbusConfirmMasks(byte buffer[])
/// <ModbusWriteMasks> /// <ModbusWriteMasks>
void OnModbusConfirmMasksException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusConfirmMasksException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x15;
gTimerModbusWriteMasks.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusWriteMasks>
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 ------------------------------------------------------- // REGION: ModbusReadWriteRegisters -------------------------------------------------------
@ -678,9 +408,6 @@ void ModbusReadWriteRegisters(word readAddress, word readCount, word writeAddres
word overallLength; word overallLength;
word i; word i;
if (gRequests[funcCode].Count > 0)
return;
dataLength = 2 * writeCount; dataLength = 2 * writeCount;
overallLength = maxLength - 2*121 + dataLength; overallLength = maxLength - 2*121 + dataLength;
@ -697,27 +424,17 @@ void ModbusReadWriteRegisters(word readAddress, word readCount, word writeAddres
mbw.Data[i] = values[i]; mbw.Data[i] = values[i];
memcpy_h2n(buffer, mbw); memcpy_h2n(buffer, mbw);
ModbusSend(buffer, overallLength, mbw.Header.TxID);
ModbusSend(buffer, overallLength);
gRequests[funcCode].Count = 1;
memcpy(gRequests[funcCode].Buffer, buffer, overallLength);
gRequests[funcCode].Length = overallLength;
gTimerModbusWriteRegisters.Set(@sysvar::Config::Modbus::RequestTimeout);
ModbusRecv();
} }
/// <ModbusReadWriteRegisters> /// <ModbusReadWriteRegisters>
void OnModbusReceiveConfirmRegisters(byte buffer[]) void OnModbusReceiveConfirmRegisters(byte buffer[])
{ {
const byte funcCode = 0x17;
byte numRegs; byte numRegs;
struct ModbusResReceiveRegisters mbr; struct ModbusResReceiveRegisters mbr;
gTimerModbusReadWriteRegisters.Cancel();
gRequests[funcCode].Count = 0;
memcpy_n2h(mbr, buffer); 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); OnModbusReadRegistersSuccess(mbr, numRegs);
} }
@ -725,33 +442,10 @@ void OnModbusReceiveConfirmRegisters(byte buffer[])
/// <ModbusReadWriteRegisters> /// <ModbusReadWriteRegisters>
void OnModbusReceiveConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex) void OnModbusReceiveConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex)
{ {
const byte funcCode = 0x17;
gTimerModbusReadWriteRegisters.Cancel();
gRequests[funcCode].Count = 0;
OnModbusReadBitsFailed(Exception, ex, mbap); OnModbusReadBitsFailed(Exception, ex, mbap);
} }
/// <ModbusReadWriteRegisters>
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 ------------------------------------------------------------ // REGION: OnModbusReceive ------------------------------------------------------------
/// <OnModbusReceive> /// <-OnModbusReceive>
void OnModbusReceive(dword socket, long result, dword address, dword port, byte buffer[], dword size) void OnModbusReceive(dword socket, long result, dword address, dword port, byte buffer[], dword size)
{ {
if (result == 0) if (result == 0)
@ -787,7 +481,7 @@ void OnModbusReceive(dword socket, long result, dword address, dword port, byte
} }
} }
/// <OnModbusReceive> /// <-OnModbusReceive>
void OnModbusReceive2(byte buffer[], dword size) void OnModbusReceive2(byte buffer[], dword size)
{ {
struct ModbusApHeader mbap; struct ModbusApHeader mbap;
@ -814,12 +508,12 @@ void OnModbusReceive2(byte buffer[], dword size)
if (offset != size) // Can be removed. if (offset != size) // Can be removed.
{ {
bin_to_strhex(buffer, str); 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); runError(1002, 1);
} }
} }
/// <OnModbusReceive> /// <-OnModbusReceive>
void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader mbap) void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader mbap)
{ {
// Test transaction identifier? // Test transaction identifier?
@ -844,9 +538,18 @@ void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader
} }
// MBAP Header is OK :) Go on // 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! if (mbap.FuncCode > 0x80) // Oh no, we got a exception!
{ {
OnModbusReceive2Exceptions(buffer[offset+08], mbap); OnModbusReceive2Exceptions(buffer[offset+08], mbap);
gQueueAck.Remove(mbap.TxID); // Remove from acknowledge queue
return; return;
} }
@ -886,9 +589,11 @@ void OnModbusReceive2OnePacket(byte buffer[], int offset, struct ModbusApHeader
default: default:
writeLineEx(0, 3, "We received funcCode 0x%X?", mbap.FuncCode); writeLineEx(0, 3, "We received funcCode 0x%X?", mbap.FuncCode);
} }
gQueueAck.Remove(mbap.TxID); // Remove from acknowledge queue
} }
/// <OnModbusReceive> /// <-OnModbusReceive>
void OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap) void OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap)
{ {
enum ModbusException ex; enum ModbusException ex;
@ -950,4 +655,100 @@ void OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap)
OnModbusReceiveConfirmRegistersException(mbap, ex); OnModbusReceiveConfirmRegistersException(mbap, ex);
break; 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();
} }

View file

@ -105,7 +105,8 @@ variables
enum ModbusRequestError enum ModbusRequestError
{ {
Exception, Exception,
Timeout Timeout,
FinalTimeout
}; };
enum ModbusException enum ModbusException
{ {
@ -119,4 +120,17 @@ variables
GatewayPathsNA = 0x0A, GatewayPathsNA = 0x0A,
TargetOffline = 0x0B TargetOffline = 0x0B
}; };
enum ModbusFuncCode
{
ReadBits1 = 0x01,
ReadBits2 = 0x02,
ReadRegisters1 = 0x03,
ReadRegisters2 = 0x04,
WriteBit = 0x05,
WriteRegister = 0x06,
WriteBits = 0x0F,
WriteRegisters = 0x10,
MaskRegister = 0x16,
ReadWriteRegisters = 0x17
};
} }

View file

@ -1,4 +1,8 @@
/*@!Encoding:1252*/ /*@!Encoding:1252*/
void SysvarInit()
{
sysSetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", "");
}
void ParseDeviceCode(word dev) void ParseDeviceCode(word dev)
{ {
@ -6,7 +10,6 @@ void ParseDeviceCode(word dev)
byte numChannels; byte numChannels;
char modules[1024]; char modules[1024];
char module[10]; char module[10];
char templ[10];
sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", modules, elCount(modules)); sysGetVariableString("%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info", "Modules", modules, elCount(modules));
@ -17,13 +20,13 @@ void ParseDeviceCode(word dev)
if (dev & 0x0001) // Input Module if (dev & 0x0001) // Input Module
{ {
input = 1; input = 1;
strncpy(templ, "DI%d,", elCount(templ)); strncpy(module, "DI%d,", elCount(module));
@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits += numChannels; @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputBits += numChannels;
} }
else if (dev & 0x0002) // Output Module else if (dev & 0x0002) // Output Module
{ {
input = 0; input = 0;
strncpy(templ, "DO%d,", elCount(templ)); strncpy(module, "DO%d,", elCount(module));
@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputBits += numChannels; @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputBits += numChannels;
} }
else // blööd else // blööd
@ -31,11 +34,6 @@ void ParseDeviceCode(word dev)
writeLineEx(0, 3, "<%NODE_NAME%> Device code 0x%X cannot be decoded", dev); writeLineEx(0, 3, "<%NODE_NAME%> Device code 0x%X cannot be decoded", dev);
runError(1003, 1); 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 else
{ {
@ -48,18 +46,23 @@ void ParseDeviceCode(word dev)
numChannels = 2; numChannels = 2;
break; break;
default: // unknown device. Ouch! 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; return;
} }
if (input) if (input)
{ {
strncpy(templ, "AI%d,", elCount(templ)); strncpy(module, "AI%d,", elCount(module));
@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters += numChannels; @sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::InputRegisters += numChannels;
} }
else else
{ {
strncpy(templ, "AO%d,", elCount(templ)); strncpy(module, "AO%d,", elCount(module));
@sysvar::%BUS_TYPE%%CHANNEL%::%NODE_NAME%::Info::OutputRegisters += numChannels; @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);
} }

View file

@ -8,15 +8,10 @@ includes
void ModbusConnectTo(char Remote_IP[], word Remote_Port) void ModbusConnectTo(char Remote_IP[], word Remote_Port)
{ {
TcpConnectTo("192.168.1.3", 502); TcpConnectTo(Remote_IP, Remote_Port);
} }
void ModbusSend(byte buffer[]) void ModbusSnd(byte buffer[], word length)
{
TcpSnd(buffer, elCount(buffer));
}
void ModbusSend(byte buffer[], word length)
{ {
TcpSnd(buffer, length); TcpSnd(buffer, length);
} }

View file

@ -8,15 +8,10 @@ includes
void ModbusConnectTo(char Remote_IP[], word Remote_Port) void ModbusConnectTo(char Remote_IP[], word Remote_Port)
{ {
UdpConnectTo("192.168.1.3", 502); UdpConnectTo(Remote_IP, Remote_Port);
} }
void ModbusSend(byte buffer[]) void ModbusSnd(byte buffer[], word length)
{
UdpSnd(buffer, elCount(buffer));
}
void ModbusSend(byte buffer[], word length)
{ {
UdpSnd(buffer, length); UdpSnd(buffer, length);
} }

View file

@ -8,8 +8,6 @@ includes
variables variables
{ {
TcpSocket gSocket; TcpSocket gSocket;
byte gRxBuffer[8192];
} }
@ -21,20 +19,14 @@ word TcpOpenSocket()
dword i = 0; dword i = 0;
CHAR errorText[200]; CHAR errorText[200];
localIp = SetupIp(Local_IP);
if (localIp == INVALID_IP)
return INVALID_IP;
// Try to open socket // Try to open socket
do do
{ {
localPort = random(65536-10240)+10240; gSocket = TcpSocket::Open(0, 0);
gSocket = TcpSocket::Open(localIp, localPort);
if (gSocket.GetLastSocketError() != 0) if (gSocket.GetLastSocketError() != 0)
{ {
gSocket.GetLastSocketErrorAsString(errorText, elcount(errorText)); 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); while (gSocket.GetLastSocketError() != 0 && i++ < 9);
@ -46,7 +38,7 @@ word TcpOpenSocket()
} }
else 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; return 0;

View file

@ -14,6 +14,8 @@ variables
dword gRemoteIP = INVALID_IP; dword gRemoteIP = INVALID_IP;
word gRemotePort = 0; word gRemotePort = 0;
byte gRxBuffer[8192];
} }
// Not needed // Not needed

View file

@ -8,14 +8,12 @@ includes
variables variables
{ {
UdpSocket gSocket; UdpSocket gSocket;
byte gRxBuffer[8192];
} }
word UdpOpenSocket() word UdpOpenSocket()
{ {
dword i = 0; byte i;
CHAR errorText[200]; CHAR errorText[200];
if (EthGetAdapterStatus() != 2) // Not connected if (EthGetAdapterStatus() != 2) // Not connected
@ -25,6 +23,7 @@ word UdpOpenSocket()
} }
// Try to open socket // Try to open socket
i = 0;
do do
{ {
gSocket = UdpSocket::Open(0, 0); // Open socket on any IP and Port 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()); 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) if (gSocket.GetLastSocketError() != 0)
{ {
@ -93,7 +92,7 @@ void UdpRecv()
return; return;
} }
result = gSocket.ReceiveFrom(gRxBuffer, elcount(gRxBuffer)); result = gSocket.ReceiveFrom(gRxBuffer, elCount(gRxBuffer));
if (result != 0) // Calling OnUdpReceive otherwise if (result != 0) // Calling OnUdpReceive otherwise
{ {
@ -101,8 +100,8 @@ void UdpRecv()
if (gIpLastErr != WSA_IO_PENDING) // Calling OnUdpReceive otherwise if (gIpLastErr != WSA_IO_PENDING) // Calling OnUdpReceive otherwise
{ {
gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elcount(gIpLastErrStr)); gSocket.GetLastSocketErrorAsString(gIpLastErrStr, elCount(gIpLastErrStr));
writeLineEx(0, 2, "<%NODE_NAME%> UdpRecv Error (%d): %s", gIpLastErr, gIpLastErrStr); writeLineEx(0, 2, "<%NODE_NAME%> UdpReceiveFrom Error (%d): %s", gIpLastErr, gIpLastErrStr);
gSocket.Close(); gSocket.Close();
gSocketState = CLOSED; gSocketState = CLOSED;
} }

View file

@ -1,17 +1,17 @@
;CANoe Version |4|7|1|42353 modbus ;CANoe Version |4|7|1|42356 modbus
Version: 8.2.40 Build 40 Version: 8.2.40 Build 40
32 PRO 32 PRO
10 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 APPDIR Vector.CANoe.SignalGenerators.DLL
Vector.CANoe.SignalGenerators, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null Vector.CANoe.SignalGenerators, Version=8.2.40.0, Culture=neutral, PublicKeyToken=null
Vector.CANoe.SignalGenerators.ComponentWrapper Vector.CANoe.SignalGenerators.ComponentWrapper
2 1
1.0.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 VGlobalConfiguration 1 Begin_Of_Object
17 17
VGlobalParameters 2 Begin_Of_Object VGlobalParameters 2 Begin_Of_Object
@ -425,15 +425,15 @@ VCaplOptionsStreamer 3 Begin_Of_Object
End_Of_Object VCaplOptionsStreamer 3 End_Of_Object VCaplOptionsStreamer 3
VSVConfigurationStreamer 3 Begin_Of_Object VSVConfigurationStreamer 3 Begin_Of_Object
1 1
1713 1710
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<systemvariables version="4"> <systemvariables version="4">
<namespace name="" comment=""> <namespace name="" comment="">
<namespace name="Config" comment=""> <namespace name="Config" comment="">
<namespace name="Modbus" comment=""> <namespace name="Modbus" comment="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="times" name="MaxRetransmissionCount" comment="How often a retransmission of a request will be sent until it gets discarded and an error is thrown." bitcount="32" isSigned="true" encoding="65001" type="int" startValue="1" minValue="1" minValuePhys="1" maxValue="10" maxValuePhys="10" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="ms" name="RequestTimeout" comment="The maximum duration for a Modbus-UDP/-TCP request in milliseconds. After timeout a retransmission may be started (see MaxRetransmissionCount). Use `ping` to get the maximum latency to a device, double it and add 2-3 ms for processing." bitcount="32" isSigned="true" encoding="65001" type="int" startValue="5" minValue="1" minValuePhys="1" maxValue="1000" maxValuePhys="1000" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="ms" name="RequestTimeout" comment="The maximum duration for a Modbus-UDP/-TCP request in milliseconds. After timeout a retransmission may be started (see MaxRetransmissionCount). Use `ping` to get the maximum latency to a device, double it and add 2-3 ms for processing." bitcount="32" isSigned="true" encoding="65001" type="int" startValue="5" minValue="1" minValuePhys="1" maxValue="1000" maxValuePhys="1000" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Port" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="502" minValue="1" minValuePhys="1" maxValue="65535" maxValuePhys="65535" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Port" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="502" minValue="1" minValuePhys="1" maxValue="65535" maxValuePhys="65535" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="times" name="MaxTransmissionCount" comment="How often a retransmission of a request will be sent until it gets discarded and an error is thrown." bitcount="0" isSigned="true" encoding="65001" type="int" startValue="3" minValue="1" minValuePhys="1" maxValue="10" maxValuePhys="10" />
</namespace> </namespace>
<namespace name="TcpIp" comment=""> <namespace name="TcpIp" comment="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="AdapterIndex" comment="Index of network interface to use" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="2" minValue="1" minValuePhys="1" maxValue="20" maxValuePhys="20" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="AdapterIndex" comment="Index of network interface to use" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="2" minValue="1" minValuePhys="1" maxValue="20" maxValuePhys="20" />
@ -443,7 +443,7 @@ VSVConfigurationStreamer 3 Begin_Of_Object
</systemvariables> </systemvariables>
2 2
1 1
<VFileName V4 QL> 1 "..\Modbus\modbus.vsysvar" <VFileName V4 QL> 1 "modbus.vsysvar"
1 1
End_Of_Object VSVConfigurationStreamer 3 End_Of_Object VSVConfigurationStreamer 3
@ -3438,7 +3438,7 @@ VTraceControlFixedModeExpansionItems 15 Begin_Of_Object
0 0
End_Of_Object VTraceControlFixedModeExpansionItems 15 End_Of_Object VTraceControlFixedModeExpansionItems 15
14 14
J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus - preStack J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
14 14
Trace Window Trace Window
@ -3863,151 +3863,7 @@ End_Of_Object VBoxRoot 15
End_Of_Object VDataBox 14 End_Of_Object VDataBox 14
1 1
6 6
14 12
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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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]
VSysVarObject 14 Begin_Of_Object VSysVarObject 14 Begin_Of_Object
1 1
VHostSignal 15 Begin_Of_Object VHostSignal 15 Begin_Of_Object
@ -4040,80 +3896,8 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 4 2 1
1 8 2 0 0 16777215 1 8 0 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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 -1000 1000 -1000 0
[End_of_Item] [End_of_Item]
VSysVarObject 14 Begin_Of_Object VSysVarObject 14 Begin_Of_Object
@ -4148,7 +3932,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 6 2 3
1 1 2 0 0 16777215 1 1 2 0 0 16777215
1 10000 1 0 1 10000 1 0
[End_of_Item] [End_of_Item]
@ -4184,7 +3968,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 5 2 2
1 1 2 0 0 16777215 1 1 2 0 0 16777215
1 10000 1 0 1 10000 1 0
[End_of_Item] [End_of_Item]
@ -4220,7 +4004,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 11 2 7
1 1 2 0 0 16777215 1 1 2 0 0 16777215
0 2000 0 0 0 2000 0 0
[End_of_Item] [End_of_Item]
@ -4256,7 +4040,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 10 2 8
1 1 2 0 0 16777215 1 1 2 0 0 16777215
0 2000 0 0 0 2000 0 0
[End_of_Item] [End_of_Item]
@ -4292,7 +4076,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 9 2 6
1 1 2 0 0 16777215 1 1 2 0 0 16777215
0 123 0 0 0 123 0 0
[End_of_Item] [End_of_Item]
@ -4328,7 +4112,7 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 8 2 5
1 1 2 0 0 16777215 1 1 2 0 0 16777215
0 123 0 0 0 123 0 0
[End_of_Item] [End_of_Item]
@ -4364,10 +4148,154 @@ End_Of_Object ValueObjectConfiguration::VConfiguredSysVar 15
End_Of_Serialized_Data 14 End_Of_Serialized_Data 14
End_Of_Object VSysVarObject 14 End_Of_Object VSysVarObject 14
[Begin_of_Item] [Begin_of_Item]
2 7 2 4
1 8 2 0 0 16777215 1 8 2 0 0 16777215
-1000 1000 -1000 0 -1000 1000 -1000 0
[End_of_Item] [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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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<class_ValueObjectConfiguration::IConfiguredSysVar> 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 20 308 16 169 75 75 50 100 100 100 1
35 35 35 35
30 30
@ -4507,7 +4435,7 @@ VUniqueBox 4 Begin_Of_Object
VBoxRoot 5 Begin_Of_Object VBoxRoot 5 Begin_Of_Object
1 1
3 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 1
@ -4515,7 +4443,7 @@ MDI_DOCK_INFO_END
5 5
1 1
6 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 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 END_OF_DOCK_INFO
1 1
@ -4596,7 +4524,7 @@ VConfigurationRoot 8 Begin_Of_Object
End_Of_Object VConfigurationRoot 8 End_Of_Object VConfigurationRoot 8
<VFileName V4 QL> 1 "ModbusClientUDP.can" <VFileName V4 QL> 1 "ModbusClientUDP.can"
1 1
J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus - preStack\ModbusClientUDP.cbf J:\HsKA\NB7\Bachelorthesis\CANoe\Modbus\ModbusClientUDP.cbf
Wago_3 Wago_3
modbus modbus
5 5
@ -4614,13 +4542,15 @@ Wago_3
1 0 0 0 1 0 0 0
SS_BEGIN_COMMON_INFO SS_BEGIN_COMMON_INFO
1 1
4 5
Behavior Behavior
1 1
Buses Buses
1 1
Misc Misc
1 1
Modules
1
Timing Timing
1 1
SS_END_COMMON_INFO SS_END_COMMON_INFO
@ -4964,7 +4894,7 @@ End_Of_Serialized_Data 7
End_Of_Object VProgrammedNode 7 End_Of_Object VProgrammedNode 7
0 0
0 0
Startdelay 0 0 0 Startdelay 1 0 10
Jitter 0 0 1 0 0 0 0 Jitter 0 0 1 0 0 0 0
1 1
1 ETHERNET_IL.DLL 1 ETHERNET_IL.DLL
@ -4980,7 +4910,7 @@ VSimulinkModelViewerConfiguration 7 Begin_Of_Object
End_Of_Object VSimulinkModelViewerConfiguration 7 End_Of_Object VSimulinkModelViewerConfiguration 7
1 1
0 0
1861272737 3870015388
0 0
NodeSignalPanelBustypeCount 0 NodeSignalPanelBustypeCount 0
End_Of_Object VSimulationNode 6 End_Of_Object VSimulationNode 6
@ -5235,7 +5165,7 @@ NULL
End_Of_Object VDOLocalInfoStruct 3 End_Of_Object VDOLocalInfoStruct 3
0.000000 0.000000
0 0 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 SS_BEGIN_COMMON_INFO
1 1
0 0
@ -5247,7 +5177,7 @@ Ether1
11 11
1 1
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 SS_BEGIN_COMMON_INFO
1 1
3 3
@ -5649,12 +5579,12 @@ SymbSelHeaderMgrBegin
SymbSelHeaderMgrEnd SymbSelHeaderMgrEnd
End End
Begin Begin
3 0 -1 3 0 18
2 2
modbus modbus
Systemvariablen Systemvariablen
( 0 ) ( 2 ( 1 ( 0 ) 2 ( 0 ) 0 ) 3 ( 1 ( 1 ( 0 ) 2 ( 0 ) 0 ) 0 ) 0 )
SymbSelHeaderMgrBegin SymbSelHeaderMgrBegin
1 4 1 4
0 1 200 0 0 0 1 200 0 0

View file

@ -5,19 +5,22 @@
<namespace name="Wago_3" comment=""> <namespace name="Wago_3" comment="">
<namespace name="Config" comment=""> <namespace name="Config" comment="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="IP" comment="comment" bitcount="8" isSigned="true" encoding="65001" type="string" startValue="192.168.1.3" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="IP" comment="comment" bitcount="8" isSigned="true" encoding="65001" type="string" startValue="192.168.1.3" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="ms" name="Interval" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="100" minValue="10" minValuePhys="10" maxValue="10000" maxValuePhys="10000" />
</namespace> </namespace>
<namespace name="Info" comment=""> <namespace name="Info" comment="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="InputRegisters" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="123" maxValuePhys="123" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Modules" comment="" bitcount="8" isSigned="true" encoding="65001" type="string" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Modules" comment="" bitcount="8" isSigned="true" encoding="65001" type="string" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="SerialCode" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="1" minValuePhys="1" maxValue="10000" maxValuePhys="10000" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="SerialCode" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="1" minValuePhys="1" maxValue="10000" maxValuePhys="10000" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="DeviceCode" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="1" minValuePhys="1" maxValue="10000" maxValuePhys="10000" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="DeviceCode" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="1" minValuePhys="1" maxValue="10000" maxValuePhys="10000" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="InputBits" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="2000" maxValuePhys="2000" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="InputBits" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="2000" maxValuePhys="2000" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="InputRegisters" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="123" maxValuePhys="123" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="OutputBits" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="2000" maxValuePhys="2000" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="OutputBits" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="2000" maxValuePhys="2000" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="OutputRegisters" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="123" maxValuePhys="123" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="OutputRegisters" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="123" maxValuePhys="123" />
</namespace> </namespace>
<namespace name="Data" comment=""> <namespace name="Data" comment="">
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Bits" comment="" bitcount="8" isSigned="true" encoding="65001" type="data" arrayLength="0" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="InputBits" comment="" bitcount="8" isSigned="true" encoding="65001" type="data" arrayLength="0" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="Registers" comment="" bitcount="8" isSigned="true" encoding="65001" type="data" arrayLength="0" /> <variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="OutputBits" comment="" bitcount="8" isSigned="true" encoding="65001" type="data" arrayLength="0" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="InputRegisters" comment="" bitcount="8" isSigned="true" encoding="65001" type="data" arrayLength="0" />
<variable anlyzLocal="2" readOnly="false" valueSequence="false" unit="" name="OutputRegisters" comment="" bitcount="8" isSigned="true" encoding="65001" type="data" arrayLength="0" />
</namespace> </namespace>
</namespace> </namespace>
</namespace> </namespace>