From f04e31f35e00b7c26d03eedac4fc8ba9c0a69b39 Mon Sep 17 00:00:00 2001 From: Jonny007-MKD Date: Thu, 12 Jun 2014 17:01:37 +0000 Subject: [PATCH] Use values from 0x1022..0x1025 to get the number of IOs --- Modbus-CAPL/include/CAPL/MakeConfig.can | 33 ++++++++++++++++--- Modbus-CAPL/include/CAPL/ModbusClient.can | 1 - .../CAPL/include/ModbusClientCommon.cin | 16 ++++----- .../include/CAPL/include/ModbusFunctions.cin | 12 ++----- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/Modbus-CAPL/include/CAPL/MakeConfig.can b/Modbus-CAPL/include/CAPL/MakeConfig.can index 4799dc6..30360c8 100644 --- a/Modbus-CAPL/include/CAPL/MakeConfig.can +++ b/Modbus-CAPL/include/CAPL/MakeConfig.can @@ -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() /// 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(" \n"); diff --git a/Modbus-CAPL/include/CAPL/ModbusClient.can b/Modbus-CAPL/include/CAPL/ModbusClient.can index 0b87453..4d130e8 100644 --- a/Modbus-CAPL/include/CAPL/ModbusClient.can +++ b/Modbus-CAPL/include/CAPL/ModbusClient.can @@ -3,7 +3,6 @@ includes { #include "include\ModbusUdpClientCommon.cin" - #include "include\ModbusFunctions.cin" } variables diff --git a/Modbus-CAPL/include/CAPL/include/ModbusClientCommon.cin b/Modbus-CAPL/include/CAPL/include/ModbusClientCommon.cin index bcb4074..aaa1473 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusClientCommon.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusClientCommon.cin @@ -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); } diff --git a/Modbus-CAPL/include/CAPL/include/ModbusFunctions.cin b/Modbus-CAPL/include/CAPL/include/ModbusFunctions.cin index 853a724..ef32a1b 100644 --- a/Modbus-CAPL/include/CAPL/include/ModbusFunctions.cin +++ b/Modbus-CAPL/include/CAPL/include/ModbusFunctions.cin @@ -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: