Posts: 74
Threads: 21
Joined: Sep 2016
Reputation:
0
18.03.2019, 17:01
(This post was last modified: 18.03.2019, 17:11 by sx3.)
Hello,
I'm having difficulties writing to one particular register. I don't know if the device or the documentation is faulty, or if we are sending out wrong type to it.
Code: 0x00001 Unit on
0x00002 Overpressure mode
0x00003 Boost mode
0x00004 Away mode
0x00005 Clear Alarms Write 1 to clear alarm, reads always 0
0x00006 Reset filter timer Write 1 to reset filter timer, reads always 0
Manufacturer say: Discrete output - 0x0006 (this is the register I'm having trouble with)
In LM it should be
Code: { "name": "Reset filter timer", "bus_datatype": "bool", "type": "coil", "address": 5, "writable": 1, "bus_address": "2/1/5" },
I can read on Modbus documention that there are different commands, FC01 = read, FC05 = Write single, FC15 = Write multiple.
Can I in JSON mapper define for example FC05?
I have spoke with one guy that say he doesn't have any trouble resetting the filter timer over modbus using 0x0006 register.
However, he uses a Siemens Pxc100 with RTU module, and his command is "5x00005", I was thinking the 5x=FC05?
Funny thing is, I'm able to write to the first 4 registers in above list without problem and the JSON is identical, so I believe it should work as I have written in the JSON and something must be wrong in the device handling Modbus.
Code:
.........................
{ "name": "Unit ON", "bus_datatype": "bool", "type": "coil", "address": 0, "writable": 1, "bus_address": "2/1/0" },
{ "name": "Overpressure mode", "bus_datatype": "bool", "type": "coil", "address": 1, "writable": 1, "bus_address": "2/1/1" },
{ "name": "Boost mode", "bus_datatype": "bool", "type": "coil", "address": 2, "writable": 1, "bus_address": "2/1/2" },
{ "name": "Away mode", "bus_datatype": "bool", "type": "coil", "address": 3, "writable": 1, "bus_address": "2/1/3" },
{ "name": "Clear Alarms", "bus_datatype": "bool", "type": "coil", "address": 4, "writable": 1, "bus_address": "2/1/4" },
{ "name": "Reset filter timer", "bus_datatype": "bool", "type": "coil", "address": 5, "writable": 1, "bus_address": "2/1/5" },
.........................
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
Profile entry looks correct. Do you get anything in ModBus error log? Have you tried using RTU read test to check other coil values?
Posts: 74
Threads: 21
Joined: Sep 2016
Reputation:
0
18.03.2019, 17:17
(This post was last modified: 18.03.2019, 17:20 by sx3.)
No errors in the log.
I have tested reading, however this particular coil I have problem with always reads 0, so it would be hard to find the correct coil this way.
When I write 1 to the coil, it returns to 0 after a second or two. I have tried reading the coil as fastest I can after I've have sent 1 (< 1sec), but always read 0.
Reading Coil-0 return true, which is correct. The rest are false. (as it should be)
Reading coils >5 gives "Illegal data address", so probably coil 5 is correct.. And if we are using correct command I guess something is corrupted in device firmware!?
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
The documentation states that read always returns 0 for this coil. And since addressing starts with 1 there the correct address for filter reset is 5 that you are already using.
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
Hello,
I am fiddling with a UIO20E, with the intention of configuring it as outputs.
I have the mapping like this.
Code: {
"manufacturer": "Indomogal",
"description": "Universal 16+4 I/O module",
"mapping": [
{
"name": "Output 1",
"bus_datatype": "1",
"type": "coil",
"address": 0,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 2",
"bus_datatype": "bool",
"type": "coil",
"address": 1,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 3",
"bus_datatype": "bool",
"type": "coil",
"address": 2,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 4",
"bus_datatype": "bool",
"type": "coil",
"address": 3,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 5",
"bus_datatype": "bool",
"type": "coil",
"address": 4,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 6",
"bus_datatype": "bool",
"type": "coil",
"address": 5,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 7",
"bus_datatype": "bool",
"type": "coil",
"address": 6,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 8",
"bus_datatype": "bool",
"type": "coil",
"address": 7,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 9",
"bus_datatype": "bool",
"type": "coil",
"address": 8,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 10",
"bus_datatype": "bool",
"type": "coil",
"address": 9,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 11",
"bus_datatype": "bool",
"type": "coil",
"address": 10,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 12",
"bus_datatype": "bool",
"type": "coil",
"address": 11,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 13",
"bus_datatype": "bool",
"type": "coil",
"address": 12,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 14",
"bus_datatype": "bool",
"type": "coil",
"address": 13,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 15",
"bus_datatype": "bool",
"type": "coil",
"address": 14,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 16",
"bus_datatype": "bool",
"type": "coil",
"address": 15,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
}
]
}
In principle it works correctly, since I get voltage at the outputs.
But in registers, I get this: Modbus (RTU 1 slave 1) read failed: Illegal data value.
I installed a 120 ohm resistor, so I saw in another post, before installing it it gave me more errors.
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
Please post full profile. What baud rate are you using?
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
13.03.2020, 07:55
(This post was last modified: 13.03.2020, 07:56 by davidchispas.)
(12.03.2020, 19:35)admin Wrote: Please post full profile. What baud rate are you using?
RTU 1
RTU (serial) enabled: ok
Port: /dev/RS485-1
Baud rate: 115200
Parity: Even
Duplex: Half-duplex
----------------------------------------------------
Connection type: RTU 1
Device address: 1
Poll interval (seconds): 5
Timeout (seconds): 0.5
I increased the timeout even to 5 seconds but it does the same. In the log, after overnight, Read failed: Illegal data value and read failed: Operation timed out
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
Try lowering baud rate to 19200. You will need to change baud rate in RTU settings first then do write address to UIO20.
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
13.03.2020, 08:09
(This post was last modified: 13.03.2020, 14:58 by davidchispas.)
(13.03.2020, 07:58)admin Wrote: Try lowering baud rate to 19200. You will need to change baud rate in RTU settings first then do write address to UIO20. I made the changes and it gives me the same errors ... If I remove the load 120 Ohms the device flashes red.
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
Hi
Any other tests you can do? From what I saw in some other post, these types of errors are frequent. I don't know if anyone managed to fix it.
Cheers
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
You still haven't provided full profile that you are using for reading registers. You can also test using second RS-485 port if there's a hardware issue of some sort.
Another thing to try is to read register data via script. You need to disable modbus mapper before running this script. Post what you get in Logs tab. Change baud rate (19200) if needed.
Code: require('luamodbus')
mb = luamodbus.rtu()
mb:open('/dev/RS485-1', 19200, 'E', 8, 1, 'H')
mb:connect()
buffer = {}
mb:setdebug(function(msg)
buffer[ #buffer + 1 ] = msg
end)
mb:setslave(1)
res = { mb:readinputregisters(0, 16) }
log(res)
mb:close()
log(table.concat(buffer))
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
(16.03.2020, 11:16)admin Wrote: You still haven't provided full profile that you are using for reading registers. You can also test using second RS-485 port if there's a hardware issue of some sort.
Another thing to try is to read register data via script. You need to disable modbus mapper before running this script. Post what you get in Logs tab. Change baud rate (19200) if needed.
Code: require('luamodbus')
mb = luamodbus.rtu()
mb:open('/dev/RS485-1', 19200, 'E', 8, 1, 'H')
mb:connect()
buffer = {}
mb:setdebug(function(msg)
buffer[ #buffer + 1 ] = msg
end)
mb:setslave(1)
res = { mb:readinputregisters(0, 16) }
log(res)
mb:close()
log(table.concat(buffer))
Code: initscript 16.03.2020 19:22:02
* table:
[1]
* number: 22810
[2]
* number: 22845
[3]
* number: 22748
[4]
* number: 22828
[5]
* number: 22854
[6]
* number: 22819
[7]
* number: 22872
[8]
* number: 0
[9]
* number: 0
[10]
* number: 0
[11]
* number: 0
[12]
* number: 0
[13]
* number: 0
[14]
* number: 0
[15]
* number: 0
[16]
* number: 0
Code: initscript 16.03.2020 19:22:02
* string: [01][04][00][00][00][10][F1][C6]
Waiting for a confirmation...
<01><04><20><59><1A><59><3D><58><DC><59><2C><59><46><59><23><59><58><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><85><1D>
the profile is this
Code: {
"manufacturer": "Indomogal",
"description": "Universal 16+4 I/O module",
"mapping": [
{
"name": "Output 1",
"bus_datatype": "1",
"type": "coil",
"address": 0,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 2",
"bus_datatype": "bool",
"type": "coil",
"address": 1,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 3",
"bus_datatype": "bool",
"type": "coil",
"address": 2,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 4",
"bus_datatype": "bool",
"type": "coil",
"address": 3,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 5",
"bus_datatype": "bool",
"type": "coil",
"address": 4,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 6",
"bus_datatype": "bool",
"type": "coil",
"address": 5,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 7",
"bus_datatype": "bool",
"type": "coil",
"address": 6,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 8",
"bus_datatype": "bool",
"type": "coil",
"address": 7,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 9",
"bus_datatype": "bool",
"type": "coil",
"address": 8,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 10",
"bus_datatype": "bool",
"type": "coil",
"address": 9,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 11",
"bus_datatype": "bool",
"type": "coil",
"address": 10,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 12",
"bus_datatype": "bool",
"type": "coil",
"address": 11,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 13",
"bus_datatype": "bool",
"type": "coil",
"address": 12,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 14",
"bus_datatype": "bool",
"type": "coil",
"address": 13,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 15",
"bus_datatype": "bool",
"type": "coil",
"address": 14,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
},
{
"name": "Output 16",
"bus_datatype": "bool",
"type": "coil",
"address": 15,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"}
}
]
}
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
The reading looks ok. You said this, but your profile only has outputs:
Quote:But in registers, I get this: Modbus (RTU 1 slave 1) read failed: Illegal data value.
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
16.03.2020, 18:43
(This post was last modified: 16.03.2020, 18:44 by davidchispas.)
(16.03.2020, 18:35)admin Wrote: The reading looks ok. You said this, but your profile only has outputs:
Quote:But in registers, I get this: Modbus (RTU 1 slave 1) read failed: Illegal data value. Yes, I only have exits. So I don't understand the error messages. Do I need to change something somewhere?
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
You can add "write_only": true to all profile fields to disable reading completely.
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
04.06.2020, 11:03
(This post was last modified: 04.06.2020, 11:04 by davidchispas.)
Code: "name": "Output 1",
"bus_datatype": "bool",
"type": "coil",
"address": 0,
"writable": 1,
"value_custom": {"0": "Off", "1": "On"},
"write_only": true
What do I need to add to get the channel status? when i reset the power supply i dont get the actual status of the channel. Is there a possibility to register it in a different object?
Whenever this happens, it is always off. Is there a chance it will keep the last state?
Posts: 7758
Threads: 42
Joined: Jun 2015
Reputation:
447
You can copy definition for each coil and set "writable": true, "write_only": true for control and "writable": false, "write_only": false for status. This way you can map different objects to control and status.
Posts: 265
Threads: 37
Joined: Apr 2019
Reputation:
4
(04.06.2020, 11:16)admin Wrote: You can copy definition for each coil and set "writable": true, "write_only": true for control and "writable": false, "write_only": false for status. This way you can map different objects to control and status. Thanks Admin for the help!
|