Coder Social home page Coder Social logo

plccoms-mqtt-bridge's Introduction

plccoms-mqtt-bridge

Bi-directional communication bridge between Teco's PLCComS and MQTT broker.

plccoms-mqtt-bridge was written to integrate home automation hardware based on Tecomat Foxtrot (CP-1xxx, CP-2xxx) or the original Inels CU2-01M PLC with open source home automation software (OpenHAB, Home Assistant, ...). There are potentially other use-cases for PLC - MQTT integration and it may also work with other Teco's PLCs.

How it works

When PLCComS and plccoms-mqtt-bridge are configured to work together, plccoms-mqtt-bridge publishes changes of selected PLC variables (e.g. wall switch pressed) to MQTT topics. When a home automation software issues a command (e.g. turn on a light) plccoms-mqtt-bridge reads it from MQTT topic and sends it to PLCComS to set a PLC variable. If all components runs in the same LAN, both the monitor and control paths take only few milliseconds to execute which is fast enough to program actions in home automation software or in Node-RED.

Note that Teco provides MQTT publisher and subscriber libraries for their development tool Mosaic, however there is no single point of control over what variables get published and what topics get subscribed.

PLC Variable mapping

plccoms-mqtt-bridge uses YAML configuration file to define mapping between PLC variables and topic names. The definition uses regular expressions with capturing groups to allow creating simple and flexible mapping.

The following configuration results in forwarding two PLC variables to two topics. All other PLC variable are ignored.

var-mapping:
  - var: "OUTPUT_R0B_LIGHT_LIVINGROOM"
    state-topic: "home/living_room/light"
  - var: "OUTPUT_R0B_LIGHT_KITCHEN"
    state-topic: "home/kitchen/light"

The following configuration results in forwarding all PLC variables to topics "home/{variable-name}". No PLC variables are ignored.

var-mapping:
  - var: ".*"
    state-topic: "home/{0}"

Where {0} is a full match (in this case a full variable name). The same result can be achived using capturing group which are indexed from one:

var-mapping:
  - var: "(.*)"
    state-topic: "home/{1}"

If a PLC program uses some naming convention for variables, e.g. {UNIT_TYPE}_{UNIT_NAME}_{ITEM}_{LOCATION} with variables e.g. RELAY_R02_LIGHT_LIVINGROOM or RELAY_R05_LIGHT_KITCHEN, these can be mapped to topics home/livingroom/light and home/kitchen/light using a single mapping:

var-mapping:
  - var: "RELAY_(.*)_(.*)_(.*)"
    state-topic: "home/{3}/{2}"

The same result with non-capturing groups:

var-mapping:
  - var: "RELAY_(?:.*)_(.*)_(.*)"
    state-topic: "home/{2}/{1}"

In case PLC program does not use the word "LIGHT" in variable names but all lights are controlled by certain units:

var-mapping:
  - var: "RELAY_(?:R01|R03|R05)_(.*)"
    state-topic: "home/{1}/light"

Note that only the first match in the var-mapping collection is used and therefore each variable is forwarded to either a single topic or, if there is no match in the collection, it is not forwarded at all. plccoms-mqtt-bridge subscribes to PLCComS to be notified about changes of matched variables only.

It is possible to exclude some PLC variables using var-blacklist which, in some cases, can simplify mapping definition.

It is possible to add simple value conversion (rather than pure forwarding) E.g. Home Assistant uses ON and OFF defaults for binary values rather than 1 and 0 used by PLC. Adding a conversion function along the mapping definition will spare two or four (if using command topic) lines of every item/topic in Home Assistant's configuration.

YAML configuration

Root fields:

plccoms:

Field Default value Description
host localhost PLCComS host name or IP
port 5010 PLCComS TCP port

mqtt:

Field Default value Description
scheme tcp tcp or tls
host localhost MQTT broker host name or IP
port 1883 for tcp and 8883 fot tls MQTT TCP port
username N/A optional parameter
password N/A optional parameter
clientId MQTT client id random UUID

var-blacklist:

A collection of regular expressions. When plccoms-mqtt-bridge starts each PLC variable (enumerated by LIST command) is tested against this blacklist. If matched, it is dropped and not used in variable mapping.

var-mapping:

Field Default value Description
var N/A (required) Regular expression matching PLC variable(s).
state-topic N/A (required) MQTT topic used by plccoms-mqtt-bridge to publish PLC variable changes. The topic name can include {index} to refer to (one-based) capturing group or {0} to refer to a full match.
state-function Noop A function to convert value from PLC before it is published to topic (Noop, OneToOn, OnToOne)
cmd-topic N/A MQTT topic plccoms-mqtt-bridge subscribes to and forwards messages to PLC. The topic name can include {index} to refer to (one-based) capturing group or {0} to refer to a full match.
cmd-function Noop A function to convert value read from topic before it is sent to PLC. (Noop, OneToOn, OnToOne)
var-delta N/A (optional) Instructs plccoms to send updates of numerical values only if they change by more than delta. This can reduce network traffic (including MQTT) caused by e.g. some temperature sensors.
log-level info Log4Jv2 log levels (info, debug, trace)

Build and run locally

./gradlew clean runLocal

Build and run in container

./gradlew clean jibDockerBuild
docker run --network host -v $(pwd)/deploy/docker/config.yaml:/etc/plccoms-mqtt-bridge/config.yaml ocervinka/plccoms-mqtt-bridge

If only the second command is called, a pre-build image will be pulled from public docker registry.

plccoms-mqtt-bridge needs to be configured (See YAML configuration) to connect to to PLCComS and MQTT broker (e.g. Mosquitto) both ideally running in containers. Some newer Teco PLC models have PLCComS integrated so there is no need to host the process outside of PLC.

TODO: Helm Chart

plccoms-mqtt-bridge's People

Contributors

ocervinka avatar ondrej-cervinka avatar acmetelka avatar

Stargazers

万里 avatar  avatar  avatar  avatar Jan Pesan avatar

Watchers

 avatar  avatar  avatar  avatar

plccoms-mqtt-bridge's Issues

An issue with array variables in configuration

Hi @ocervinka, I was having problems reading array variables via PLCComs from my Foxtrot - for example CIDLA[3].PORUCHA. These variables were listed but had no content. I found out that the problem is in the configuration.yaml: if there are square brackets in the variable name, these variables are not mapped by the bridge.
Example:

  • var: "MISTNOST_M[3].TIMERENA"
    state topic: "MISTNOST_M[3].TIMERENA"

The workaround I have found is to use the * syntax, for example:

  • var: "MISTNOST_M(.*)"

Someone might find this helpful. Of course, there is room for future improvement :)
Regards, Petr

MQTT authentication

Hi Ondreji,
do you plan implement at least basic username/password authentication to MQTT server? Thanks
Jaroslav

Vícenásobné zasílání SET: pro MQTT zprávy směrem na PLCComS

Ahoj,
nevím, co dělám špatně, nebo jestli se mi nějak zle zkompilovala aplikace v dockeru, ale:
Při přidání var-mappingů do yaml.conf se každá hodnota z MQTT posílá na PLCComS server tolikrát, kolik je namapovaných proměnných. Nemyslím, že mi to dělalo před časem, když jsem už aplikaci používal, ale to jsem vyčítal data z PLC a neposílal téměř žádná směrem MQTT > PLC, tak jsem to možná jen nezjistil.

Příklad konfigurace:

plccoms:
  host: 10.0.0.106 # kubectl --context j5005 port-forward svc/plccoms 5010:5010
  port: 5010

mqtt:
  scheme: tcp
  host: 10.0.0.106 # kubectl --context j5005 port-forward svc/mosquitto 1883:1883
  port: 1883
  username: metelka
  #password: 12345
  clientId: plccoms-mqtt-bridge

var-blacklist:
  - "STATE_.+"
  - ".+_ON"
  - ".+_OFF"
  - ".+_TRIG"

  - "SYSTEM_24HOUR_OBSERVAITON_.+"
  - "SYSTEM_AG.+"
  - "USERBITS"
  - "__.+"

var-mapping:
  - var: "FVECURRENT"
    state-topic: "plc-fve/bms-b/totalcurrent"
    cmd-topic: "plc-fve/bms-b/totalcurrent/set"
  - var: "FVEVOLTAGE"
    state-topic: "plc-fve/bms-b/totalpower"
    cmd-topic: "plc-fve/bms-b/totalpower/set"

Log z dockeru, je vidět, že každou hodnotu obdrženou z MQTT pošle dvakrát na PLCComS. Kdybych měl proměnných 10, tak pošle každou 10x.

2024-07-18T00:09:54.717Z INFO   o.p.PlcMqttBridge [MQTT Call: plccoms-mqtt-bridge] MQTT->PLC: plc-fve/bms-b/totalcurrent/set,-3.63 -> FVECURRENT,-3.63
2024-07-18T00:09:54.719Z INFO   o.p.PlcMqttBridge [MQTT Call: plccoms-mqtt-bridge] MQTT->PLC: plc-fve/bms-b/totalcurrent/set,-3.63 -> FVECURRENT,-3.63
2024-07-18T00:09:54.724Z INFO   o.p.PlcMqttBridge [MQTT Call: plccoms-mqtt-bridge] MQTT->PLC: plc-fve/bms-b/totalpower/set,-188.32 -> FVEVOLTAGE,-188.32
2024-07-18T00:09:54.726Z INFO   o.p.PlcMqttBridge [MQTT Call: plccoms-mqtt-bridge] MQTT->PLC: plc-fve/bms-b/totalpower/set,-188.32 -> FVEVOLTAGE,-188.32
2024-07-18T00:09:55.067Z INFO   o.p.PlcMqttBridge [TelnetClient] PLC->MQTT: FVECURRENT,-3.630000 -> plc-fve/bms-b/totalcurrent,-3.630000
2024-07-18T00:09:55.072Z INFO   o.p.PlcMqttBridge [TelnetClient] PLC->MQTT: FVEVOLTAGE,-188.320007 -> plc-fve/bms-b/totalpower,-188.320007

Toto je log z PLCComS, kde je vidět, že pošle každou proměnnou vícekrát:

2024-07-18 02:02:20.053498 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a252 [0xec 0x51 0x68 0xc0] - addr: 00009810 size: 04 bit: 0	FVECURRENT
2024-07-18 02:02:20.053631 PLCComS->DiffCommObject():: ptr_old: 0x7fac00efe2 [0x52 0xb8 0x4e 0xc0] - addr: 00009810 size: 04 bit: 0	FVECURRENT
2024-07-18 02:02:20.053728 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a24e [0x3d 0x4a 0x3c 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 02:02:20.053790 PLCComS->DiffCommObject():: ptr_old: 0x7fac00efde [0xec 0x91 0x27 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 02:02:20.054139 PLCComS->SendNetComm():: 10.0.0.106 6 10 [RX: 0 / TX: 56] omsg = DIFF:FVECURRENT,-3.630000
DIFF:FVEVOLTAGE,-188.289993
2024-07-18 02:02:24.950252 PLCComS->DoReqCommObject():: 10.0.0.106 6 2 [RX: 88 / TX: 0] imsg = SET:FVECURRENT,-3.63
SET:FVECURRENT,-3.63
SET:FVEVOLTAGE,-188.32
SET:FVEVOLTAGE,-188.32
2024-07-18 02:02:25.093426 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a24e [0xec 0x51 0x3c 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 02:02:25.093574 PLCComS->DiffCommObject():: ptr_old: 0x7fac00efde [0x3d 0x4a 0x3c 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 02:02:25.093971 PLCComS->SendNetComm():: 10.0.0.106 6 10 [RX: 0 / TX: 29] omsg = DIFF:FVEVOLTAGE,-188.320007
2024-07-18 02:02:29.881499 PLCComS->DoReqCommObject():: 10.0.0.106 6 2 [RX: 88 / TX: 0] imsg = SET:FVECURRENT,-3.03
SET:FVECURRENT,-3.03
SET:FVEVOLTAGE,-157.20
SET:FVEVOLTAGE,-157.20
2024-07-18 02:02:29.909793 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a252 [0x85 0xeb 0x41 0xc0] - addr: 00009810 size: 04 bit: 0	FVECURRENT
2024-07-18 02:02:29.909924 PLCComS->DiffCommObject():: ptr_old: 0x7fac00efe2 [0xec 0x51 0x68 0xc0] - addr: 00009810 size: 04 bit: 0	FVECURRENT
2024-07-18 02:02:29.910020 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a24e [0x33 0x33 0x1d 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 02:02:29.910083 PLCComS->DiffCommObject():: ptr_old: 0x7fac00efde [0xec 0x51 0x3c 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE

Ještě další příklad, kde se posílalo všech 12 definovaných proměnných a bylo jedno, jestli byly definovány s maskováním části za poslední tečkou, která se liší, nebo jsem je po jedné rozepsal do conf.yaml.

  - var: "FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE"
    state-topic: "plc-fve/bms-b/mincellvoltage"
    cmd-topic: "plc-fve/bms-b/mincellvoltage/set"

  - var: "FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE"
    state-topic: "plc-fve/bms-b/maxcellvoltage"
    cmd-topic: "plc-fve/bms-b/maxcellvoltage/set"

  - var: "FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR"
    state-topic: "plc-fve/bms-b/minvoltagecellnr"
    cmd-topic: "plc-fve/bms-b/minvoltagecellnr/set"

   ..... nebo .....

  #- var: "FVEJKBMSDATA.MQTTDATA.(.*)"
  #  state-topic: "plc-fve/bms-b/{1}"
  #  cmd-topic: "plc-fve/bms-b/{1}/set"
  #  log-level: debug

2024-07-18 01:59:24.817179 PLCComS->DoReqCommObject():: 10.0.0.106 6 2 [RX: 6612 / TX: 0] imsg = SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXCELLVOLTAGE,3.246
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MAXVOLTAGECELLNR,8
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.MINVOLTAGECELLNR,13
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.AVERAGECELLVOLTAGE,3.240
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.09
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEVOLTAGE,-471.13
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.CHARGINGPOWER,0.00
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.13
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAINING,23
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
SET:FVEJKBMSDATA.MQTTDATA.CAPACITYREMAININGDERIVED,70.1
2024-07-18 01:59:25.245968 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a323 [0xbc 0x74 0x93 0x3c] - addr: 00010019 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE
2024-07-18 01:59:25.246132 PLCComS->DiffCommObject():: ptr_old: 0x7fac00f0b3 [0x96 0x43 0x8b 0x3c] - addr: 00010019 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE
2024-07-18 01:59:25.246237 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a33b [0xa4 0x90 0xeb 0x43] - addr: 00010043 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER
2024-07-18 01:59:25.246299 PLCComS->DiffCommObject():: ptr_old: 0x7fac00f0cb [0x00 0x20 0xe6 0x43] - addr: 00010043 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER
2024-07-18 01:59:25.246382 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a319 [0x8d 0x97 0x4e 0x40] - addr: 00010009 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE
2024-07-18 01:59:25.246441 PLCComS->DiffCommObject():: ptr_old: 0x7fac00f0a9 [0xf0 0xa7 0x4e 0x40] - addr: 00010009 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE
2024-07-18 01:59:25.246516 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a32f [0xa4 0x70 0x11 0xc1] - addr: 00010031 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.TOTALCURRENT
2024-07-18 01:59:25.246575 PLCComS->DiffCommObject():: ptr_old: 0x7fac00f0bf [0x7b 0x14 0x0e 0xc1] - addr: 00010031 size: 04 bit: 0	FVEJKBMSDATA.MQTTDATA.TOTALCURRENT
2024-07-18 01:59:25.246653 PLCComS->DiffCommObject():: ptr_new: 0x7fac00a24e [0xa4 0x90 0xeb 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 01:59:25.246773 PLCComS->DiffCommObject():: ptr_old: 0x7fac00efde [0x00 0x20 0xe6 0xc3] - addr: 00009806 size: 04 bit: 0	FVEVOLTAGE
2024-07-18 01:59:25.247171 PLCComS->SendNetComm():: 10.0.0.106 6 10 [RX: 0 / TX: 242] omsg = DIFF:FVEJKBMSDATA.MQTTDATA.DELTACELLVOLTAGE,0.018000
DIFF:FVEJKBMSDATA.MQTTDATA.DISCHARGINGPOWER,471.130005
DIFF:FVEJKBMSDATA.MQTTDATA.MINCELLVOLTAGE,3.228000
DIFF:FVEJKBMSDATA.MQTTDATA.TOTALCURRENT,-9.090000
DIFF:FVEVOLTAGE,-471.130005

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.