ModbusRTU, BacnetIP publisher, readonly points?
-
Hi, we are connecting our system to mangoES via modbus rtu.
All works ok withing mango, we can read points, write points, no problem.When publishing points using bacnet ip publisher, we can't write point values to modbus points.
We tried changing write priority (1 and 16), but it doesnt help.We recreated the issue using a simple modbus relay module running at 9600 bauds and trying to write to it using another mango instance. We write virtual vars just fine, but the modbus point just stays the same (we can write to it just fine in the watchlist)
I attach the config we used on our tests, using mango: (core 2.6.0 build 373, bacnet 2.2.0, and modbus 1.6.0 )
$ java -version openjdk version "1.8.0_66-internal"
config on the 'publisher' side
{ "dataSources":[ { "xid":"DS_362292", "name":"bugtest", "enabled":true, "type":"VIRTUAL", "alarmLevels":{ "POLL_ABORTED":"URGENT" }, "purgeType":"YEARS", "updatePeriodType":"HOURS", "updatePeriods":9999, "editPermission":"", "purgeOverride":false, "purgePeriod":1 }, { "xid":"DS_277802", "name":"modSerial", "enabled":true, "type":"MODBUS_SERIAL", "alarmLevels":{ "POINT_WRITE_EXCEPTION":"URGENT", "POLL_ABORTED":"URGENT", "DATA_SOURCE_EXCEPTION":"URGENT", "POINT_READ_EXCEPTION":"URGENT" }, "purgeType":"YEARS", "updatePeriodType":"HOURS", "concurrency":"SYNC_TRANSPORT", "baudRate":9600, "characterSpacing":0, "commPortId":"\/dev\/ttyUSB0", "dataBits":8, "echo":false, "encoding":"RTU", "flowControlIn":0, "flowControlOut":0, "messageFrameSpacing":0, "overrideTiming":false, "parity":0, "stopBits":2, "contiguousBatches":false, "createSlaveMonitorPoints":false, "discardDataDelay":0, "ioLogFileSizeMBytes":1.0, "logIO":false, "maxHistoricalIOLogs":1, "maxReadBitCount":2000, "maxReadRegisterCount":125, "maxWriteRegisterCount":120, "multipleWritesOnly":false, "quantize":false, "retries":2, "timeout":500, "updatePeriods":5, "editPermission":"", "purgeOverride":false, "purgePeriod":1 } ], "dataPoints":[ { "xid":"DP_829661", "name":"a", "enabled":true, "loggingType":"INTERVAL", "intervalLoggingPeriodType":"MINUTES", "intervalLoggingType":"AVERAGE", "purgeType":"YEARS", "pointLocator":{ "dataType":"NUMERIC", "changeType":{ "type":"NO_CHANGE", "startValue":"0" }, "settable":true }, "eventDetectors":[ ], "plotType":"SPLINE", "unit":"", "templateXid":"Numeric_Default", "chartColour":"black", "chartRenderer":{ "type":"IMAGE", "timePeriodType":"DAYS", "numberOfPeriods":1 }, "dataSourceXid":"DS_362292", "defaultCacheSize":1, "deviceName":"bugtest", "discardExtremeValues":false, "discardHighLimit":1.7976931348623157E308, "discardLowLimit":-1.7976931348623157E308, "intervalLoggingPeriod":1, "intervalLoggingSampleWindowSize":0, "overrideIntervalLoggingSamples":false, "purgeOverride":false, "purgePeriod":1, "readPermission":"", "setPermission":"", "textRenderer":{ "type":"ANALOG", "useUnitAsSuffix":true, "unit":"", "renderedUnit":"", "format":"0.00" }, "tolerance":0.0 }, { "xid":"DP_430617", "name":"rele1", "enabled":true, "loggingType":"INTERVAL", "intervalLoggingPeriodType":"MINUTES", "intervalLoggingType":"INSTANT", "purgeType":"YEARS", "pointLocator":{ "range":"HOLDING_REGISTER", "modbusDataType":"TWO_BYTE_INT_UNSIGNED", "writeType":"SETTABLE", "additive":0.0, "bit":0, "charset":"ASCII", "multiplier":1.0, "offset":15, "registerCount":0, "slaveId":1, "slaveMonitor":false }, "eventDetectors":[ ], "plotType":"STEP", "unit":"", "chartColour":"black", "chartRenderer":null, "dataSourceXid":"DS_277802", "defaultCacheSize":1, "deviceName":"modSerial", "discardExtremeValues":false, "discardHighLimit":1.7976931348623157E308, "discardLowLimit":-1.7976931348623157E308, "intervalLoggingPeriod":1, "intervalLoggingSampleWindowSize":0, "overrideIntervalLoggingSamples":false, "purgeOverride":false, "purgePeriod":1, "readPermission":"", "setPermission":"", "textRenderer":{ "type":"RANGE", "useUnitAsSuffix":true, "unit":"", "renderedUnit":"", "format":"bool", "rangeValues":[ { "colour":"#000000", "from":0.0, "text":"Zero", "to":0.0 }, { "colour":"#00ff00", "from":1.0, "text":"One", "to":1.0 } ] }, "tolerance":0.0 }, { "xid":"DP_836397", "name":"rele2", "enabled":true, "loggingType":"ON_CHANGE", "intervalLoggingPeriodType":"MINUTES", "intervalLoggingType":"INSTANT", "purgeType":"YEARS", "pointLocator":{ "range":"HOLDING_REGISTER", "modbusDataType":"TWO_BYTE_INT_UNSIGNED", "writeType":"SETTABLE", "additive":0.0, "bit":0, "charset":"ASCII", "multiplier":1.0, "offset":16, "registerCount":0, "slaveId":1, "slaveMonitor":false }, "eventDetectors":[ ], "plotType":"STEP", "unit":"", "chartColour":"blue", "chartRenderer":null, "dataSourceXid":"DS_277802", "defaultCacheSize":1, "deviceName":"modSerial", "discardExtremeValues":false, "discardHighLimit":1.7976931348623157E308, "discardLowLimit":-1.7976931348623157E308, "intervalLoggingPeriod":15, "intervalLoggingSampleWindowSize":0, "overrideIntervalLoggingSamples":false, "purgeOverride":false, "purgePeriod":1, "readPermission":"", "setPermission":"", "textRenderer":{ "type":"RANGE", "useUnitAsSuffix":false, "unit":"", "renderedUnit":"", "format":"boolt", "rangeValues":[ { "colour":null, "from":0.0, "text":"Zero", "to":0.0 }, { "colour":"#008000", "from":1.0, "text":"One", "to":1.0 } ] }, "tolerance":0.0 } ], "publishers":[ { "xid":"PUB_302755", "type":"BACnet", "points":[ { "dataPointId":"DP_430617", "instanceNumber":0, "objectName":"modSerial - rele1" }, { "dataPointId":"DP_836397", "instanceNumber":1, "objectName":"modSerial - rele2" }, { "dataPointId":"DP_829661", "instanceNumber":2, "objectName":"bugtest - a" } ], "snapshotSendPeriodType":"MINUTES", "localDeviceConfig":"62cb7655-d718-4c40-9552-202efb93cc91", "cacheDiscardSize":1000, "cacheWarningSize":100, "changesOnly":false, "enabled":true, "name":"bac1", "sendSnapshot":false, "snapshotSendPeriods":5 } ], "BACnetLocalDevices":[ { "baudRate":9600, "broadcastAddress":"255.255.255.255", "commPortId":"", "deviceId":31416, "deviceName":"Mango Automation", "id":"62cb7655-d718-4c40-9552-202efb93cc91", "localBindAddress":"0.0.0.0", "localNetworkNumber":0, "port":47808, "retries":2, "retryCount":1, "segTimeout":5000, "segWindow":5, "thisStation":0, "timeout":6000, "type":"ip" } ] }
on the client side
{ "dataSources":[ { "xid":"DS_467782", "name":"qwe", "enabled":true, "type":"BACnetIP", "alarmLevels":{ "INITIALIZATION_EXCEPTION":"URGENT", "DEVICE_EXCEPTION":"URGENT", "MESSAGE_EXCEPTION":"URGENT" }, "purgeType":"YEARS", "updatePeriodType":"MINUTES", "covSubscriptionTimeoutMinutes":60, "localDeviceConfig":"10d9ca6d-477a-41d2-93ab-9755780520e7", "updatePeriods":5, "purgeOverride":true, "purgePeriod":1 } ], "dataPoints":[ { "xid":"DP_166879", "name":"rele1", "enabled":true, "loggingType":"ON_CHANGE", "intervalLoggingPeriodType":"MINUTES", "intervalLoggingType":"INSTANT", "purgeType":"YEARS", "pointLocator":{ "dataType":"NUMERIC", "objectType":"ANALOG_VALUE", "propertyIdentifier":"PRESENT_VALUE", "link":"", "mac":"192.168.3.145:47808", "networkNumber":0, "objectInstanceNumber":0, "remoteDeviceInstanceNumber":31416, "settable":true, "useCovSubscription":true, "writePriority":1 }, "eventDetectors":[ ], "plotType":"STEP", "unit":"", "chartColour":"", "chartRenderer":null, "dataSourceXid":"DS_467782", "defaultCacheSize":1, "deviceName":"qwe", "discardExtremeValues":false, "discardHighLimit":1.7976931348623157E308, "discardLowLimit":-1.7976931348623157E308, "intervalLoggingPeriod":15, "intervalLoggingSampleWindowSize":0, "overrideIntervalLoggingSamples":false, "purgeOverride":true, "purgePeriod":1, "textRenderer":{ "type":"PLAIN", "useUnitAsSuffix":true, "unit":"", "renderedUnit":"", "suffix":"" }, "tolerance":0.0 }, { "xid":"DP_946499", "name":"rele2", "enabled":true, "loggingType":"ON_CHANGE", "intervalLoggingPeriodType":"MINUTES", "intervalLoggingType":"INSTANT", "purgeType":"YEARS", "pointLocator":{ "dataType":"NUMERIC", "objectType":"ANALOG_VALUE", "propertyIdentifier":"PRESENT_VALUE", "link":"", "mac":"192.168.3.145:47808", "networkNumber":0, "objectInstanceNumber":1, "remoteDeviceInstanceNumber":31416, "settable":true, "useCovSubscription":true, "writePriority":1 }, "eventDetectors":[ ], "plotType":"STEP", "unit":"", "chartColour":"", "chartRenderer":null, "dataSourceXid":"DS_467782", "defaultCacheSize":1, "deviceName":"qwe", "discardExtremeValues":false, "discardHighLimit":0.0, "discardLowLimit":0.0, "intervalLoggingPeriod":15, "intervalLoggingSampleWindowSize":0, "overrideIntervalLoggingSamples":false, "purgeOverride":true, "purgePeriod":1, "textRenderer":{ "type":"PLAIN", "useUnitAsSuffix":true, "unit":"", "renderedUnit":"", "suffix":"" }, "tolerance":0.0 }, { "xid":"DP_346289", "name":"a", "enabled":true, "loggingType":"ON_CHANGE", "intervalLoggingPeriodType":"MINUTES", "intervalLoggingType":"INSTANT", "purgeType":"YEARS", "pointLocator":{ "dataType":"NUMERIC", "objectType":"ANALOG_VALUE", "propertyIdentifier":"PRESENT_VALUE", "link":"", "mac":"192.168.3.145:47808", "networkNumber":0, "objectInstanceNumber":2, "remoteDeviceInstanceNumber":31416, "settable":true, "useCovSubscription":true, "writePriority":1 }, "eventDetectors":[ ], "plotType":"STEP", "unit":"", "chartColour":"", "chartRenderer":null, "dataSourceXid":"DS_467782", "defaultCacheSize":1, "deviceName":"qwe", "discardExtremeValues":false, "discardHighLimit":0.0, "discardLowLimit":0.0, "intervalLoggingPeriod":15, "intervalLoggingSampleWindowSize":0, "overrideIntervalLoggingSamples":false, "purgeOverride":true, "purgePeriod":1, "textRenderer":{ "type":"PLAIN", "useUnitAsSuffix":true, "unit":"", "renderedUnit":"", "suffix":"" }, "tolerance":0.0 } ], "BACnetLocalDevices":[ { "baudRate":9600, "broadcastAddress":"255.255.255.255", "commPortId":"", "deviceId":31417, "deviceName":"Mango Automation", "id":"10d9ca6d-477a-41d2-93ab-9755780520e7", "localBindAddress":"0.0.0.0", "localNetworkNumber":0, "port":47808, "retries":2, "retryCount":1, "segTimeout":5000, "segWindow":5, "strict":true, "thisStation":0, "timeout":6000, "type":"ip" } ] }
-
The BACnet publisher only supports reading point values and does not support setting values. We are planning to add this feature to it. The Modbus publisher does support writing values. We have a git issue for it that you can watch to be notified once the feature is added.
https://github.com/infiniteautomation/ma-core-public/issues/387Thanks,
Joel. -
Hmmm, ok. Thanks for the fast response.
How is it then, that virtual points can be written with the publisher?
Also, we tested one more thing:- we had our modbus point A
- we created a virtual data point VirtA
- we created two 'onchange' point links, A->VirtA and VirtA->A
- voilá, it worked, point A could be written using the bacnet publisher!
- (it also worked using a metapoint and a single pointlink)
thoughts?