Tracking product in a spiral freezer

Hi everyone,

I need to make a graphical representation of the filling of a spiral freezer. I want the operators to know the filling level at any given part of the spiral conveyor, as well as when product is expected to exit the freezer at the packaging department.

At the inlet of the freezer we have a sensor that determines the percentage width of the conveyor utilized. We do filtering and scaling (dec 0-100 %) of this value in the plc.

My first idea was to use a simple analog XY chart to represent the conveyor, and display the historical analog sensor value in this.
I have attached a picture representing this strategy.

The problem is that this will not work correctly when the freezer is stopped (historical logging keeps running), or when the freezing time (conveyor speed setpoint) is changed.

Normal freezing time (lap time of conveyor from inlet to outlet) varies between 15-60 minutes depending on the product.

Any idea how this can be realized? Should i log the data in a shift-register in the PLC? Can integer arrays be transferred from the PLC using OPC DA?



Hi Patrick,

I don’t have a complete solution for you, but I have a few ideas that may help.

I like your idea of ‘flattening out’ the conveyor and using a horizontal graph to display the contents. How about you conceptually divide the conveyor into a number of segments, with an average value for each segment stored in a database table, each record indexed by an auto-incrementing id.

You then have to work out an average value for each segment of the conveyor - this will vary depending on the speed of the conveyor. I would probably use the PLC to work out this average (although someone better at Ignition logging may be able to suggest how it can all be done within Ignition). It would first look at the speed of the conveyor and work out how many readings it had to average.

For example, if you were using 100 segments and the PLC was recording a value every second, if the conveyor was running at top speed so that the whole journey took 15 minutes (900 seconds) it would have to average 9 one second readings. If the conveyor was running at it slowest speed so that the whole journey took 60 minutes (3600 seconds) it would have to average 36 one second readings.

Once the PLC worked out the average, it would store it in a variable accessible to Ignition and set a flag so that the value was logged to the database. Every time a value was logged, the oldest value in the database would have to be deleted. In this way, the database would never hold more than the number of values matching the segments of the conveyor.

The scale shown underneath the bar chart could also be animated from the journey time of the conveyor with 0 on the right and the full time (from 15 to 60 minutes) on the left, so that users could see how long something was going to take before coming out of the freezer.

Doing things this way means that it doesn’t matter if the speed of the conveyor changes - the values will just move to the right faster or slower as required.

Let me know what you think about this idea. I’m sure what you want to do is possible.

I’d look at some sort of buffer like data structure for this. Maybe a transaction group that updates a table when a counter in the plc increments (could be accomplished easily using transaction groups)?

The table could look like:

int segment
int contents

This would map well to using bar graphs or line graphs similar to your original idea.

Create a pulse bit in the PLC that’s based on the speed of the conveyor / the number of data points you want to display. Use a transaction group and insert a new row in a table each time your pulse bit is on. Use a query to get the last 100 data points (or however many you decide) from the table -

SELECT percentage_width FROM freezer_table ORDER BY freezer_table_ndx DESC LIMIT 100

Your pulse bit actually controls how fast/slow the data moves across the chart. If the conveyor stops, so does your pulse bit, no new rows are added to the table, therefore your query will keep pulling in the same data i.e. the data stops moving across your chart. Once you’re done with a production run you could delete the data in the table, or you could run analysis on the production data, or archive the production run data.

You could also use an different table to calculate the percentage width average for each segment.

Works like a charm!

I created a standard transaction group where i added two tags, filling level and index trigger (from the PLC).
I then set the filling level to store in a SQL column, and set the transaction group trigger to the index trigger from the PLC.

The logic for the index trigger is Freezing time / table rows = pulsetime.
Example: 3600sec / 100 rows = 36 sec.

Later I will create averaging of the analog value with the same cycle to.

With the help of our SQL-guy i modified the example from Pat so that the chart will display the other way round (conveyor inlet to the left, outlet to the right).

SELECT TOP 100 
       ROW_NUMBER() OVER (ORDER BY iqf3_ndx DESC) AS IDX,
       FillingLevel
FROM
       IQF3

To scale the chart i set the X-axis to “Fixed Auto Range” 0-99.

Thank you so much everybody! :smiley: