I have a PLC program that provides an alarm buffer. This buffer contains a maximum of 30 alarms. An alarm is activated by writing 3 values to a location in the buffer along with a short optional text (10 chars). The combination of these three values gives a single value which corresponds to one of the >1000 possible alarms. I already have an idea how to do this, but there may be a more efficient way of doing it. Any suggestion ?
The idea is to have the structured tag and generate an alarm when the one of the 3 values is not null and get the alarm info from a database using the 3 values (= alarme unique code).
Any better idea ?
Your approach is reasonable, but keep in mind that PLC polling doesn't not guarantee that the three elements of a single alarm will be consistent. That is, the PLC could be changing them at the same time Ignition is reading them, and you get a mix of old and new values. The simplest way to handle that is to use Ignition's delay feature for alarms to wait one polling cycle before acting.
You're going to have a hard time with the alarms being active/ack'd/cleared on Ignition when that buffer starts rolling through the alarms.
Couldn't you just monitor the tags that send the 'alarms' to your buffer? I assume that buffer is probably just used for an HMI function. Ignition doesn't really have those limitations and could handle the 1000+ alarms all at once.
I know it's not a very logical way to do it, but the alarms are directly written in the buffer by the PLC software, which is already done and was supposed to be connected to a custom HMI. We don't want to modify the PLC software. I should have mentionned that the buffer is just an array of 30 alarms which means also only 30 alarms can be monitored at the same time. A new alarm is not shown until a buffer position get free (alarm buffer full is the last shown alarm).
What happens if you have 31 alarms going off? Is the 31st alarm just lost?
No, it's not lost, it will be displayed when a position of the buffer get free. That means we can show only the first 30 alarms, not the last 30.
I am trying to clarify how the alarm gets reset. If you show alarms 1-30 and then show alarm 31 after a few seconds you need a way to identify when the alarm has been cleared. If you consider the only active alarms are what is shown in the buffer then I think you had the right idea.