How to detect frozen values using MODBUS communication?
Is it possible to detect frozen values from Modbus slave only using Connect Blocks, Systemalarms from CI853/855?
On site we have redundant AC800M with two CI853. With configuration of connect blocks, read and write blocks we can build a kind of redundancy. This works fine so far, but sometimes communication freezes. From CI853 we get no system alarm.
We have some Modbus slaves where it is not possible to implement a watchdog signal.
Is there a possibility to use the parameter status of MBConnect, MBRead, MBWrite blocks or settings in the hardware to detect frozen values?
The next step will be to generate an alarm and to restart the communication after detection of frozen values.
Has anyone ever realized something like this before and has maybe an short instruction?
There are many kinds of value which are transceived on Modbus communication. One of them can be hourly or daily data, means just updating hourly or daily, otherwise it will keep unique value seems as frozen.
The way I implemented at my site is using on one signal (eg: AT-123) then calculating [AT-123(t) - AT-123(t-p)] = 0 or <>0, in which p is predefined calculation cycle. If result = 0 in period of p, means the value is frozen.
Hope it help.
It is not so clear for me what do you mean with "frozen values" - is that lost of communication with some slaves?
Why you don't use parameters Ndr and Error of MBRead / MBWrite blocks?
I use RS trigger - Set is from Error parameter and Reset is from Ndr AND NOT Error. If RS trigger is set for certain period (e.g. 10 s) I generate lost of communication signal, which is doing switch off/switch on procedure for En parameter of the corresponding MBConnect block.
No. Not reliably. The MB Status Codes will usually indicate when the link is entirely down but can't cover every failure case.
The Common solution to verify the link is to use a "Handshake bit"
1. SEND a bit to the Remote PLC using Send_Handshake_Address
2. The Remote PLC Copies the Bit to a different Address, Read_Hand_Shake_Address
3. READ from Read_Handshake_Address.
4. Invert the READ Value and Send It back to the PLC as the SEND value
5. If the Remote PLC Doesnt Update the Handshake within 2 or 3 read cycles, then the link failed.
Its as simple as
Master Side :
SEND_VALUE = NOT (READ_VALUE)
T_ON( in = SEND_VALUE<>READ_VALUE, Pt= 10secs, Q => LINK_FAILED);
SEND_VALUE := READ_VALUE;
Only one side of the link does the inverting.