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";
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);
}
}

View file

@ -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);
}
/// <ModbusReadBits>
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[])
/// <ModbusReadBits>
void OnModbusReceiveBitsException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x01;
gTimerModbusReadBits.Cancel();
gRequests[funcCode].Count = 0;
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;
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);
}
/// <ModbusReadRegisters>
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[])
/// <ModbusReadRegisters>
void OnModbusReceiveRegistersException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x03;
gTimerModbusReadRegisters.Cancel();
gRequests[funcCode].Count = 0;
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];
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);
}
/// <ModbusWriteBit>
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[])
/// <ModbusWriteBit>
void OnModbusConfirmBitException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x05;
gTimerModbusWriteBit.Cancel();
gRequests[funcCode].Count = 0;
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];
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);
}
/// <ModbusWriteRegister>
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[])
/// <ModbusWriteRegister>
void OnModbusConfirmRegisterException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x06;
gTimerModbusWriteRegister.Cancel();
gRequests[funcCode].Count = 0;
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;
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);
}
/// <ModbusWriteBits>
@ -462,12 +288,8 @@ void ModbusWriteBitsB(word address, word count, byte values[])
/// <ModbusWriteBits>
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[])
/// <ModbusWriteBits>
void OnModbusConfirmBitsException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x0F;
gTimerModbusWriteBits.Cancel();
gRequests[funcCode].Count = 0;
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 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);
}
/// <ModbusWriteRegisters>
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[])
/// <ModbusWriteRegisters>
void OnModbusConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x10;
gTimerModbusWriteRegisters.Cancel();
gRequests[funcCode].Count = 0;
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 ------------------------------------------------------------
@ -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);
}
/// <ModbusWriteMasks>
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[])
/// <ModbusWriteMasks>
void OnModbusConfirmMasksException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x15;
gTimerModbusWriteMasks.Cancel();
gRequests[funcCode].Count = 0;
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 -------------------------------------------------------
@ -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);
}
/// <ModbusReadWriteRegisters>
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[])
/// <ModbusReadWriteRegisters>
void OnModbusReceiveConfirmRegistersException(struct ModbusApHeader mbap, enum ModbusException ex)
{
const byte funcCode = 0x17;
gTimerModbusReadWriteRegisters.Cancel();
gRequests[funcCode].Count = 0;
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 ------------------------------------------------------------
/// <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>
/// <-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>
/// <-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>
/// <-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();
}

View file

@ -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
};
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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;

View file

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

View file

@ -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;
}

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
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
<?xml version="1.0" encoding="Windows-1252"?>
<systemvariables version="4">
<namespace name="" comment="">
<namespace name="Config" 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="" 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 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" />
@ -443,7 +443,7 @@ VSVConfigurationStreamer 3 Begin_Of_Object
</systemvariables>
2
1
<VFileName V4 QL> 1 "..\Modbus\modbus.vsysvar"
<VFileName V4 QL> 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<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]
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<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
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<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
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
<VFileName V4 QL> 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

View file

@ -5,19 +5,22 @@
<namespace name="Wago_3" 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="ms" name="Interval" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="100" minValue="10" minValuePhys="10" maxValue="10000" maxValuePhys="10000" />
</namespace>
<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="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="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="OutputRegisters" comment="" bitcount="32" isSigned="true" encoding="65001" type="int" startValue="0" minValue="0" minValuePhys="0" maxValue="123" maxValuePhys="123" />
</namespace>
<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="Registers" 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="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>