Alarming Loss of Comms to Devices

Welcome, Craig!

You will find with Ignition there is no ‘one-way’ of doing things, there are multiple ways this can be done.

This is how I do it, note the version is 7.9 so scripts will need slight updates for best performance on 8.1.x

You seem to be concerned with loss to a single device, the following is for an overview of all devices but it might give you some ideas.

I have a tag that counts the total number of connected devices:

import system
		
cDS = system.dataset.toPyDataSet(deviceDataset)

c=0
for r in cDS:
	if r['State']=="Connected":
		c = c + 1

system.tag.write("Diagnostics/Devices_Connected", c)

I have an alarm set on this tag saying if below X count and for Y duration then send an email out.

Further to that I have a power table with a ‘refresh’ button with the following script:

deviceDataset = system.device.listDevices()
 
# Assign the deviceDataset to a Power Table. This example assumes
# the Power Table is in the same container as the component that called this script
event.source.parent.getComponent('Power Table').data = deviceDataset

This allows you to see at a glance what devices are connected/connecting/disconnected/disabled and the driver type, easier than the gateway status page as it is constantly refreshing.

Further to that I have a periodic script that pings each device and records the status to a DB, this then lets me see if there are drops in the diagnostic count which sites were not responding at that time historically;

def ping(address,timeout=2000):
	global pingStat
	from java.net import InetAddress
	ip = InetAddress.getByName(address)
	if ip.isReachable(timeout) == True:
		pingStat = 1
	elif ip.isReachable(timeout) == False:
		pingStat = 0


def dev_ping():
	dlist = system.device.listDevices()
	for row in range(dlist.getRowCount()):
		# Check if device uses ModbusTCP driver and device is enabled
		if dlist.getValueAt(row,3) == "ModbusTcp" and dlist.getValueAt(row,1) == 1:
			# Get device host name.
			devSite = dlist.getValueAt(row,0)
			print devSite
			devIP = system.device.getDeviceHostname(dlist.getValueAt(row,0))
			print devIP
			ping(devIP)
			if pingStat == 1:
				print "Dev ok"
				system.db.runSFPrepUpdate("insert into ign.dev_stat (dev_site, dev_ip, dev_state) values (?,?,?)",[devSite, devIP, pingStat],datasources=["MySQL"])
			
			elif pingStat == 0:
				print "no conn"
				system.db.runSFPrepUpdate("insert into ign.dev_stat (dev_site, dev_ip, dev_state) values (?,?,?)",[devSite, devIP, pingStat],datasources=["MySQL"])
				
dev_ping()

As usual, YMMV.

1 Like