Use values from 0x1022..0x1025 to get the number of IOs
This commit is contained in:
parent
57ea11238f
commit
f04e31f35e
4 changed files with 38 additions and 24 deletions
|
@ -58,7 +58,7 @@ on preStart
|
|||
strncpy(fnSysvar, "include/SysVars/generated.vsysvar", elCount(fnSysvar));
|
||||
strncpy(fnDbc, "include/DBC/generated.dbc", elCount(fnDbc));
|
||||
|
||||
OutputDebugLevel = Error;
|
||||
OutputDebugLevel = Info;
|
||||
}
|
||||
|
||||
on start
|
||||
|
@ -205,7 +205,7 @@ void AnalyzeDevices()
|
|||
ADi = 0; // First IP address
|
||||
ADl = gIpsSorted.Size();
|
||||
|
||||
write("Analyzing %s...", gIpsSorted[ips[ADi]].Ip);
|
||||
writeLineEx(0, 1, "Analyzing %s", gIpsSorted[ips[ADi]].Ip);
|
||||
gIpsSorted[ips[ADi]].Vendor = Wago;
|
||||
|
||||
if (gRemoteIP != INVALID_IP) // If we already do have a socket
|
||||
|
@ -216,6 +216,10 @@ void AnalyzeDevices()
|
|||
// read the important registers from the device
|
||||
ModbusReadRegisters(0x2011, 1); // Serial Code
|
||||
ModbusReadRegisters(0x2012, 1); // Device Code
|
||||
ModbusReadRegisters(0x1022, 1); // Number of AOs
|
||||
ModbusReadRegisters(0x1023, 1); // Number of AIs
|
||||
ModbusReadRegisters(0x1024, 1); // Number of DOs
|
||||
ModbusReadRegisters(0x1025, 1); // Number of DIs
|
||||
ModbusReadRegisters(0x2030, 65); // Connected IO 1
|
||||
ModbusReadRegisters(0x2031, 64); // Connected IO 2
|
||||
ModbusReadRegisters(0x2032, 64); // Connected IO 3
|
||||
|
@ -225,6 +229,9 @@ void AnalyzeDevices()
|
|||
/// <Step3>
|
||||
void AnalyzeDevicesNext()
|
||||
{
|
||||
gIpsSorted[ips[ADi]].DeviceIOs.Modules[strlen(gIpsSorted[ips[ADi]].DeviceIOs.Modules)-1] = 0;
|
||||
writeEx(0, 1, ": AOs: %d, AIs: %d, DOs: %d, DIs: %d --> %s", gIpsSorted[ips[ADi]].DeviceIOs.OutputRegisters, gIpsSorted[ips[ADi]].DeviceIOs.InputRegisters, gIpsSorted[ips[ADi]].DeviceIOs.OutputBits, gIpsSorted[ips[ADi]].DeviceIOs.InputBits, gIpsSorted[ips[ADi]].DeviceIOs.Modules);
|
||||
|
||||
if (++ADi >= ADl) // we have analyzed all devices
|
||||
{
|
||||
MakeFiles(); // go to Step4
|
||||
|
@ -233,9 +240,14 @@ void AnalyzeDevicesNext()
|
|||
|
||||
ADn = 0; // Zero message received
|
||||
gRemoteIP = ips[ADi]; // Next IP address
|
||||
write("Analyzing %s...", gIpsSorted[ips[ADi]].Ip);
|
||||
writeLineEx(0, 1, "Analyzing %s", gIpsSorted[ips[ADi]].Ip);
|
||||
gIpsSorted[ips[ADi]].Vendor = Wago;
|
||||
ModbusReadRegisters(0x2011, 1); // Serial Code
|
||||
ModbusReadRegisters(0x2012, 1); // Device Code
|
||||
ModbusReadRegisters(0x1022, 1); // Number of AOs
|
||||
ModbusReadRegisters(0x1023, 1); // Number of AIs
|
||||
ModbusReadRegisters(0x1024, 1); // Number of DOs
|
||||
ModbusReadRegisters(0x1025, 1); // Number of DIs
|
||||
ModbusReadRegisters(0x2030, 65); // Connected IO 1
|
||||
ModbusReadRegisters(0x2031, 64); // Connected IO 2
|
||||
ModbusReadRegisters(0x2032, 64); // Connected IO 3
|
||||
|
@ -280,6 +292,18 @@ void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbres, struct
|
|||
case 0x2012:
|
||||
gIpsSorted[ips[ADi]].deviceCode = mbres.Data[0];
|
||||
break;
|
||||
case 0x1022:
|
||||
gIpsSorted[ips[ADi]].DeviceIOs.OutputRegisters = mbres.Data[0] / 16;
|
||||
break;
|
||||
case 0x1023:
|
||||
gIpsSorted[ips[ADi]].DeviceIOs.InputRegisters = mbres.Data[0] / 16;
|
||||
break;
|
||||
case 0x1024:
|
||||
gIpsSorted[ips[ADi]].DeviceIOs.OutputBits = mbres.Data[0];
|
||||
break;
|
||||
case 0x1025:
|
||||
gIpsSorted[ips[ADi]].DeviceIOs.InputBits = mbres.Data[0];
|
||||
break;
|
||||
case 0x2030:
|
||||
case 0x2031:
|
||||
case 0x2032:
|
||||
|
@ -293,7 +317,7 @@ void OnModbusReadRegistersSuccess(struct ModbusResReceiveRegisters mbres, struct
|
|||
break;
|
||||
}
|
||||
|
||||
if (++ADn == 6) // If we received all registers (6 messages)
|
||||
if (++ADn == 10) // If we received all registers (6 messages)
|
||||
AnalyzeDevicesNext();
|
||||
}
|
||||
|
||||
|
@ -388,7 +412,6 @@ void GenSysvars()
|
|||
PutString(gIpsSorted[ipN].DeviceCode);
|
||||
PutString("\" minValue=\"1\" minValuePhys=\"1\" maxValue=\"10000\" maxValuePhys=\"10000\" />\n");
|
||||
// Modules
|
||||
gIpsSorted[ipN].DeviceIOs.Modules[strlen(gIpsSorted[ipN].DeviceIOs.Modules)-1] = 0;
|
||||
PutString(" <variable anlyzLocal=\"2\" readOnly=\"true\" valueSequence=\"false\" unit=\"\" name=\"Modules\" comment=\"The type and number of inputs of modules that are connected to the server\" bitcount=\"8\" isSigned=\"true\" encoding=\"65001\" type=\"string\" startValue=\"");
|
||||
PutString(gIpsSorted[ipN].DeviceIOs.Modules);
|
||||
PutString("\" />\n");
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
includes
|
||||
{
|
||||
#include "include\ModbusUdpClientCommon.cin"
|
||||
#include "include\ModbusFunctions.cin"
|
||||
}
|
||||
|
||||
variables
|
||||
|
|
|
@ -91,7 +91,7 @@ void OnModbusReceiveBits(byte buffer[])
|
|||
memcpy_n2h(mbres, buffer);
|
||||
memcpy_n2h(mbreq, gQueueAck[mbres.Header.TxID].Buffer);
|
||||
|
||||
writeDbg(MbDebug, "Received %d bits from 0x%04X", mbreq.Count, mbreq.Address);
|
||||
writeDbg(MbInfo, "Received %d bits from 0x%04X", mbreq.Count, mbreq.Address);
|
||||
|
||||
for (i = 0; i < mbres.ByteCount; i++)
|
||||
{
|
||||
|
@ -145,7 +145,7 @@ void OnModbusReceiveRegisters(byte buffer[])
|
|||
memcpy_n2h(mbres, buffer);
|
||||
memcpy_n2h(mbreq, gQueueAck[mbres.Header.TxID].Buffer);
|
||||
|
||||
writeDbg(MbDebug, "Received %d registers from 0x%04X", mbreq.Count, mbreq.Address);
|
||||
writeDbg(MbInfo, "Received %d registers from 0x%04X", mbreq.Count, mbreq.Address);
|
||||
|
||||
OnModbusReadRegistersSuccess(mbres, mbreq);
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ void OnModbusConfirmBit(byte buffer[])
|
|||
|
||||
memcpy_n2h(mbc, buffer);
|
||||
|
||||
writeDbg(MbDebug, "Set bit at 0x%04X to %d", mbc.Address, mbc.Value);
|
||||
writeDbg(MbInfo, "Set bit at 0x%04X to %d", mbc.Address, mbc.Value);
|
||||
|
||||
OnModbusWriteBitSuccess(mbc);
|
||||
}
|
||||
|
@ -236,7 +236,7 @@ void OnModbusConfirmRegister(byte buffer[])
|
|||
|
||||
memcpy_n2h(mbc, buffer);
|
||||
|
||||
writeDbg(MbDebug, "Set register at 0x%04X to %d", mbc.Address, mbc.Value);
|
||||
writeDbg(MbInfo, "Set register at 0x%04X to %d", mbc.Address, mbc.Value);
|
||||
|
||||
OnModbusWriteRegisterSuccess(mbc);
|
||||
}
|
||||
|
@ -328,7 +328,7 @@ void OnModbusConfirmBits(byte buffer[])
|
|||
|
||||
memcpy_n2h(mbc, buffer);
|
||||
|
||||
writeDbg(MbDebug, "Updated &d bits at 0x%04X", mbc.Count, mbc.Address);
|
||||
writeDbg(MbInfo, "Updated &d bits at 0x%04X", mbc.Count, mbc.Address);
|
||||
|
||||
OnModbusWriteBitsSuccess(mbc);
|
||||
}
|
||||
|
@ -381,7 +381,7 @@ void OnModbusConfirmRegisters(byte buffer[])
|
|||
|
||||
memcpy_n2h(mbc, buffer);
|
||||
|
||||
writeDbg(MbDebug, "Updated &d registers at 0x%04X", mbc.Count, mbc.Address);
|
||||
writeDbg(MbInfo, "Updated &d registers at 0x%04X", mbc.Count, mbc.Address);
|
||||
|
||||
OnModbusWriteRegistersSuccess(mbc);
|
||||
}
|
||||
|
@ -425,7 +425,7 @@ void OnModbusConfirmMasks(byte buffer[])
|
|||
|
||||
memcpy_n2h(mbc, buffer);
|
||||
|
||||
writeDbg(MbDebug, "Applied masks at 0x%04X", mbc.Address);
|
||||
writeDbg(MbInfo, "Applied masks at 0x%04X", mbc.Address);
|
||||
|
||||
OnModbusWriteMasksSuccess(mbc);
|
||||
}
|
||||
|
@ -481,7 +481,7 @@ void OnModbusReceiveConfirmRegisters(byte buffer[])
|
|||
memcpy_n2h(mbres, buffer);
|
||||
memcpy_n2h(mbreq, gQueueAck[mbres.Header.TxID].Buffer);
|
||||
|
||||
writeDbg(MbDebug, "Wrote some registers and received %d registers from 0x%04X", mbreq.Count, mbreq.Address);
|
||||
writeDbg(MbInfo, "Wrote some registers and received %d registers from 0x%04X", mbreq.Count, mbreq.Address);
|
||||
|
||||
OnModbusReadRegistersSuccess(mbres, mbreq);
|
||||
}
|
||||
|
|
|
@ -35,13 +35,11 @@ void ParseDeviceCode(word dev, enum Vendor vendor, struct deviceIOs dios)
|
|||
{
|
||||
input = 1;
|
||||
strncpy(module, "DI%d,", elCount(module));
|
||||
dios.InputBits += numChannels;
|
||||
}
|
||||
else if (dev & 0x0002) // Output Module
|
||||
{
|
||||
input = 0;
|
||||
strncpy(module, "DO%d,", elCount(module));
|
||||
dios.OutputBits += numChannels;
|
||||
}
|
||||
else // blööd
|
||||
{
|
||||
|
@ -55,8 +53,8 @@ void ParseDeviceCode(word dev, enum Vendor vendor, struct deviceIOs dios)
|
|||
{
|
||||
case 881: // devices that have no inputs/outputs
|
||||
return;
|
||||
case 477: // devices that have 2 outputs
|
||||
input = 0;
|
||||
case 477: // devices that have 2 inputs
|
||||
input = 1;
|
||||
numChannels = 2;
|
||||
break;
|
||||
default: // unknown device. Ouch!
|
||||
|
@ -64,15 +62,9 @@ void ParseDeviceCode(word dev, enum Vendor vendor, struct deviceIOs dios)
|
|||
return;
|
||||
}
|
||||
if (input)
|
||||
{
|
||||
strncpy(module, "AI%d,", elCount(module));
|
||||
dios.InputRegisters += numChannels;
|
||||
}
|
||||
else
|
||||
{
|
||||
strncpy(module, "AO%d,", elCount(module));
|
||||
dios.OutputRegisters += numChannels;
|
||||
}
|
||||
}
|
||||
break; // switch(vendor)
|
||||
default:
|
||||
|
|
Loading…
Reference in a new issue