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";
|
||||
|
||||
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);
|
||||
|
|
|
@ -9,37 +9,33 @@ variables
|
|||
{
|
||||
const word gMaxPacketLength = __size_of(struct ModbusReqWriteRegisters);
|
||||
|
||||
// Global storage for pending requests, associated by funcCode
|
||||
struct
|
||||
msTimer gtRobin;
|
||||
word gTxID = 0x0000; // Transaction Identifier for Modbus. Used as index for gQueue
|
||||
|
||||
// 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);
|
||||
char ip[16];
|
||||
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)
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -149,9 +104,6 @@ void ModbusReadRegisters(word address, word count) // 16 bit
|
|||
byte buffer[length];
|
||||
struct ModbusReqRead mbr;
|
||||
|
||||
if (gRequests[funcCode].Count > 0)
|
||||
return;
|
||||
|
||||
ModbusMakeHeader(mbr.Header, length);
|
||||
// Payload
|
||||
mbr.Header.FuncCode = funcCode; // [1] Function Code; 3: Read Holding Registers (AI), 4: Read Input Registers (AIO), seems to be the same for WAGO 750-881
|
||||
|
@ -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;
|
||||
|
@ -951,3 +656,99 @@ void OnModbusReceive2Exceptions(byte exCode, struct ModbusApHeader mbap)
|
|||
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
|
||||
{
|
||||
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
|
||||
};
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -14,6 +14,8 @@ variables
|
|||
|
||||
dword gRemoteIP = INVALID_IP;
|
||||
word gRemotePort = 0;
|
||||
|
||||
byte gRxBuffer[8192];
|
||||
}
|
||||
|
||||
// Not needed
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue