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:
parent
73e18085c3
commit
dde6cef26f
11 changed files with 405 additions and 695 deletions
|
@ -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);
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
|
@ -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
|
||||||
|
};
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in a new issue