Use values from 0x1022..0x1025 to get the number of IOs

This commit is contained in:
Jonny007-MKD 2014-06-12 17:01:37 +00:00
parent 57ea11238f
commit f04e31f35e
4 changed files with 38 additions and 24 deletions

View file

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

View file

@ -3,7 +3,6 @@
includes
{
#include "include\ModbusUdpClientCommon.cin"
#include "include\ModbusFunctions.cin"
}
variables

View file

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

View file

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