The buzz around Artificial Intelligence (AI) has been hard to ignore, and it’s not just the trade publications fueling the hype. As someone who has been cautiously optimistic about AI, I can’t help but feel myself leaning more towards a pro-AI stance as I witness its transformative impact. With the advent of cutting-edge AI-based tools like ChatGPT, it’s clear that AI is no longer just a futuristic concept, but a powerful tool that’s already changing the game.
While AI has been steadily making its way into automation applications, particularly in vision systems, there are countless other use cases for machine learning and AI at the edge. For years, the limitations of memory, processing power, physical form, and price have hindered progress at the edge. However, with advancements in PLC products, these barriers are rapidly being overcome. The question now is, what data do you need to effectively implement an AI application at the edge?
To answer this question, the table below was compiled based on AI applications in industrial automation application.
Real-time sensor data on machine operating conditions, production data, quality data, historical process data, environmental conditions.
Root cause analysis
Historical production data, fault data, maintenance records, quality control data, environmental data.
Machine learning-based control
Real-time sensor data on machine operating conditions, historical machine data, environmental conditions, and production data.
Automated decision-making
Real-time sensor data, historical data on machine performance, historical maintenance records, production schedules, and delivery schedules.
Real-time monitoring
Real-time sensor data on machine operating conditions, production data, quality data, and environmental conditions.
Autonomous robots
Real-time sensor data, machine operating data, production data, environmental data.
While this list is a higher level view of relevant data for different applications, there are other data factors. These include data quality, quantity, and accessibility, as well as considerations around data privacy and security. In some cases, a data storage device may be needed from which data is pulled back into the PLC as needed. Also ,the elephant in the room is what type of algorithms and AI functions can a PLC actually execute. More to delve into on all these points. One thing is for sure, the final solution is going to be much more involved than a two letter acronym (AI) infers.
Moving forward, my aim is to be concise and informative in posts. If you’re interested in learning more about the trends, challenges, and opportunities in AI implementation at the edge, be sure to subscribe. In future posts, we’ll explore other aspects of AI at the PLC, and I welcome your comments and requests for specific topics.
After a 5 year break from Drives & Systems, I’ve returned!
I’ve stayed active in the industrial automation space and worked through a range of machine automation projects at Schneider Electric over the last few years. From robotics and motion through HVAC and pump control systems. Lots learnt and and a lot to capture. Hopefully capturing some of it here comes as a benefit to others.
Wasn’t sure what I was going to find here but I have come back to some interesting stats on the site. Also some good insight around PLC programming topics users engaged with most here. For instance users seem to have landed here while googling for info on Codesys arrays. This is a promising development in the industrial controls world, knowing that data structures are being used more at the PLC level. Will expand on some of this insight and the topic of arrays in PLC programming in a future post.
For today, I’ve been exploring the usage of ChatGPT in industrial automation. The combination of large language model processing and reinforcement learning along with what seems to be a substantial data set has led to a pretty amazing outcome. More importantly, it will have some strong use cases in industrial automation too. The use cases from code generation to building specifications, data collection to troubleshooting will likely unfold more and more in the coming months and years.
A query I took to ChatGPT recently was to compare a few different real time Ethernet communication protocols. While some of this may be outdated since the data references are from September 2021, the output generated was quick and definitely a great reference for automation industry folks.
Whether working through a specification or just looking to learn about the different protocols, this will come in handy.
One important point, the quality of the query makes all the difference. For example when I queried a comparison with Sercos, the outcome was totally different from Sercos III which is newer. So be precise on the query.
Network
EtherCAT
SERCOS III
Ethernet/IP with CIP motion
Architecture
Centralized controller to multiple devices
Centralized controller to multiple devices
Distributed control system (devices communicate directly)
Topology
Line, Tree, Star
Line or ring network
Star, Linear, Ring
Data Transmission
Asynchronous
Asynchronous
Synchronous
Data Transfer Rate
Up to 10 Gbps
Up to 100 Mbps
Up to 100 Mbps
Cycle Time
100 ns
31.25 μs
Up to 16 μs
Determinism
Highly deterministic
Highly deterministic
Moderately deterministic
Jitter
Very low
Low
High
Synchronization
Hardware-based
Hardware-based
Software-based
Scalability
Good
Limited
Good
Real-time Communication
Yes
Yes
Yes
Security
Good
Good
Good
Descriptions of each area of comparison:
Row
Description
Architecture
The relationship between the central controller and the network devices, including whether the network is centralized or distributed, and whether devices communicate directly with each other or through the central controller.
Topology
The physical layout of the network, including whether it is a line, ring, or star network, and how devices are connected to the network.
Data Transmission
The method used to transmit data on the network, including whether it is synchronous or asynchronous.
Data Transfer Rate
The maximum rate at which data can be transferred on the network, typically measured in bits per second (bps) or megabits per second (Mbps).
Cycle Time
The time it takes for one complete cycle of communication on the network, including the time it takes for the central controller to send a command to a device and receive a response.
Determinism
The degree of consistency in the time it takes for communication to occur on the network, with high determinism indicating a consistent and predictable communication pattern.
Jitter
The amount of variation in the time it takes for communication to occur on the network, with low jitter indicating a consistent and predictable communication pattern.
Synchronization
The method used to synchronize communication between devices on the network, including whether it is hardware-based or software-based.
Scalability
The ability of the network to accommodate a varying number of devices without significantly impacting its performance or requiring major changes to the network architecture.
Real-time Communication
The ability of the network to support real-time communication, which is critical for industrial automation applications where precise timing is necessary.
Security
The level of security provided by the network, including measures to prevent unauthorized access, data loss, or data corruption.
Everything is hooked up but something isn’t working. It worked before but not right now. Or, it’s a new system and you haven’t got it working yet. In any case, troubleshooting industrial controls systems usually involves a repeatable approach or pattern of actions.
1. Break the system down into components.
There is a root cause to what is going wrong. Each system is made of of multiple components – software and hardware. To zero in on the root cause, check if each part/component/sub-part of the system works. Example: PLC not communicating with VFD over Modbus. Questions to ask and things to check:
Check if the VFD responds to Modbus polls from a Modbus simulator on your computer.
Alternately, if there is another PLC, preferably identical, hook it up to the drive and download the same program. Check if it communicates.
If there is another VFD available, preferably one that is known to be functional. Also preferable if its of the same type, hook that up to the PLC. Check if it communicates.
Note: Check that the communication settings in the PLC and VFD are correct.
The concept here is to test individual components to zero in on the root cause.
2. Go deep into the workings of each sub-component- including inputs, outputs and the software when possible.
This becomes easier if you know which subsection of each component may be suspect. To the communications breakdown example above, it could be the serial port ( hardware) or the serial communication settings( software). This provides for immediate leads to follow.
In any case, when troubleshooting industrial controls address the obvious first, and then go deeper into each sub-component. Confirm that everything is plugged in and powered up correctly. Can’t count the number of times something wasn’t working … because it wasn’t powered up.
3. Bring in alternative/replacement components, if available.
This includes replacement cables. Depends on the stage / I.e development, legacy/installed. This is noted described in item 1 above. The implication here is to consider carrying spare parts to a site when possible. If this is not possible, consider alternatives like software to test for specific functionality.
4. Don’t alter too many characteristics at a time.
Issues are sometimes a combination of two things happening. Example: PLC won’t communicate with an HMI. The HMI was replaced and the problem persists. The old HMI was connected back in and the PLC replaced,- the problem remained. Replaced the PLC and HMI and figured out that some kind of wiring issue had taken out the serial ports on both devices. Moral of the story: Check one component and then consider combinations.
5. Use software where possible.
One example noted in item 1 above. Another example for ethernet communications troubleshooting is a tool like Wireshark.
Use case: Watch communication lines for packets coming through and sequence of events.
6. Document testing and troubleshooting efforts.
Write down the sequence of tested items. Makes a big difference after you go through several hours of troubleshooting and forget what has been tested. Also, take pictures as much as possible. Helps when recapping items covered or when researching sub components in front of your computer.
7. Consider the environment, timing and non- obvious of issues.
Time and space are at the core of things. Noise from close by systems, or an environmental effect at the same time of day may cause intermittent issues. This goes back to non-obvious factors to consider.
There may be non-obvious factors that may affect things. One example is a electrical noise issues. Co-located power wiring or bad grounding practices could affect this.
Another example of a non-obvious factor may be related to people or process factors. Example: an operator may be shutting down a device or parts of a system and not powering them up again correctly.
Another example: someone updated the firmware to one of the devices and it doesn’t communicate to the other devices any more. The problem here may be more of a process issue but knowing if the firmware was recently updated provides leads for next steps.
Based on Google Trends, ladder diagram seems to be the most searched language. However, past PLC programming trends are no indicator of future requirements.
Each language has its pros and cons. With most 61131-3 compliant environments, the great thing is that each part of a PLC program can be written with a different language. This allows for the usage of the right language for the right purpose or application.
PLC’s continue to have more features, and applications are increasingly applying these new features. Examples: Data handling with arrays, sequencing state diagrams, more math, … A ladder diagram is not a good way to utilize or apply some of these functions. Fortunately, the alternative is not too difficult to pick up.
What are some of the underlying factors that keep the ladder diagram preference going?
Ladder diagram is similar to a electrical control schematic with rails on each end. This makes it a easier for maintenance folks and electricians to troubleshoot it if the need arises.
A large proportion( PLC count) of PLC’s sold go into ‘simpler’ applications. These applications are covered by the small and mid-range PLC market. The applications may be start/stop, sequencing and boolean logic based for the most part. These are great application grounds for ladder diagrams.
Some PLC programming environments have a strong ladder editor. That combined with other features such as a live, animated view of the system when logged in with the ladder environment make it appealing. Other environments animate when logged in using any of the languages.
We all like what worked before. Even when it doesn’t work well enough anymore. Until we have to do something different to stay in business. And then change is imminent and accelerated.
Why will the industrial control world need more than ladder diagram moving forward?
Much more connectivity. PLC’s handle much more than just logic. They connect to other devices on the factory floor and at the plant level or even remotely.
Data handling. PLC’s today have sufficient memory to track and control thousands of data points. The tools to handled these data points are best applied in non-ladder languages. Example: Arrays, file handlers, math functions..
Based on the above evolutions in industrial control, the following points need to be considered:
Every language has its benefits, don’t get intimidated just based on familiarity.
Consider what needs to be done before picking a language
Stay open minded.
Ladder is good for viewing inputs and outputs and basic functions with triggers and timers. Structured text is good for math and data manipulation. Function block diagram is good for getting a graphical overview of a system. Sequential function chart is good for state based system organization. On larger PLC programs, all of them can be used for different parts.
The following Automation.com article covers the languages at a high level, with some details on pros and cons of each.
Going back to some of the other PLC programming trend observations
Interestingly, the term ‘structured text’ is strongly related to ‘CODESYS’ and ‘61131’ search terms. Note: The table embedded below shows the ‘Rising’ terms by default. Click on the ellipsis like button on the bottom right and select ‘Top’ to see the others.
Another interesting observation with regards to search cycles. July and December seems to be down-cycle parts on most years. Might it be tied to mid year and end year vacation times? Summer and winter breaks maybe?
On average, ladder diagram gets nearly double the search volume compared to structured text. This is followed by function block diagram which got about one third of the search volume relative to ladder diagram. Sequential function chart is a faraway fourth with about one tenth of the search volume relative to ladder diagram. Note, these are averages and there may be measurement errors due to exact search terms and various languages. Also, various vendors do have slightly different names for the languages compared to the IEC61131-3 names.
If you have a specific reason why you pick one language over another, leave a comment below.
There are several ways to implement a PLC program state diagram. One of the best ways is using a CASE structure in Structured Text. This statement is specifically true for PLC programs that need to handle a state -to-multi-state system. The benefit of good state-based organization makes troubleshooting easier. It also helps with readability and maintainability of a program.
IEC61131-3 helps with organizing PLC programs
The IEC61131-3 software model helps the organization and sequencing. It defines the ability to ‘divide and conquer’ a larger system down to individual program units ( program organization units or POU’s in 61131-3 lingo). Also, the ability to have multiple tasks helps organize the sequence of the execution of program units. The standard also specifies Sequential Function Chart as the environment to organize a PLC program.
Having said that, if you are to build a sequence with a point -to-multipoint state diagram, a CASE structure in Structured Text is probably the most effective way to do it. We shall examine this in a little more depth.
Why CASE structure in ST?
When one state executes, all other states do not. This is unlike the ladder diagram environment where a rung is within the execution path even if the logic within it is not currently active.
Any state can be transitioned to any other state and vice versa.
Example:
Example: While running, a machine has to operate several different sequences:
one sequence for when there is a power loss condition
a different sequence when a jam is detected
another sequence when an analog input goes below a threshold
This does not mean that the entire program has to be in Structured Text
One of the benefits of the 61131-3 standard is that each program organization unit can be written in a different language. The I/O interface can be written in ladder diagram. This helps maintenance folks provide the first line of troubleshooting by checking I/O statuses.The main program operation can be written with the step/state based Sequential Function Chart. The RUN operation with all the logic
There is much confusion on the internet and probably in perception among PLC programmers about which language is best for a step/state based program. Ladder diagrams have been around for a long time which has led to much bias towards it. Also, it is relatively easy for maintenance personnel to work with it. However, all facts considered, it is not the best for organizing a state based system. The preference for ladder ( besides the above points) is also strongly tied to the way one of the major PLC programming platform is/was structured.
Moving forward, a mixed programming language approach is best. It helps speed up troubleshooting and development of PLC programs. It also will cover better analytics and data handling in PLC’s with the usage of arrays.
What would a CASE structure for a Multi-State PLC Program Look Like?
The frame of one might look like follows:
There are going to be programmers who use SFC for state diagrams. Then there is a part of the community who ( for various reasons) will be using ladder logic. If there is a point to be made for any of these selections, submit your thoughts in the comments section below.
While the title states PLC ethernet network addresses, this post applies to any device on ethernet. With ethernet growing rapidly in industrial automation, and many if not most control engineers not having a mainstream IT networking background, this is a primer on the topic of IP addressing and subnets.
Ethernet connectivity is included on many if not most newer PLC’s and industrial automation devices. As such, basic knowledge of Ethernet networks is a requirement for control engineers and automation personnel. The topic has come up several times over the last few months on PLCTalk. This weeks pick is a post by PLCTalk longtime user Operaghost. It is from March 2016 and covers some important notes about networks and subnetworks ( subnets).
The post has been published here with permission from Operaghost. Operaghost’s text is in blue. Some parts are expanded further with the diagrams below.
Subnetworking is used to define a specific division out of a larger network. The ‘Subnet mask’ is applied to an IP address to define the ‘network prefix’ for the subnet. The rest of the available bits in an address becomes host addressable addresses within the subnet. More details here
The original question by WillM is as follows ( in green):
Simple question but I want to be certain. Lets say you have 2 separate PLCs on a network with the following configuration…
PLC 1 192.168.1.1 255.255.255.0
PLC 2 192.168.1.2 255.255.0.0
If i set my PC up with the following… 192.168.1.X 255.255.255.0 or 192.168.1.X 255.255.0.0
Will I be able to access both PLCs without having to change the subnet?
I’ve tested it and it works. I’ve read up on subnets and in my head it works but someone has told me there may be issues. My understanding is that both IP addresses are within the smaller Subnet of 255.255.255.0 so if my laptop was set to 255.255.0.0 it would be accessible.
Am i missing something or is it ok?
There were several responses in between, and then Operaghost’s descriptive response ( in blue below):
Ok, there is some misinformation going on here. Yes, what you described will work.
But the mixed subnet masks is usually not a good idea just from a organization aspect. But it is certainly allowed.
So this may be more background than you wanted, but I wanted to set the record straight.
Breakdown of IP Address Ranges for Networks
Class A addresses range from 1.0.0.0 – 127.255.255.255. So for example, 10.0.0.1 starts with a 10 so it is a Class A address. Class A addresses use 8 bits to represent the network address and 24 bits to represent the individual hosts. So with Class A I could have 128 individual networks with each network containing over 2 billion host devices.
The bit level representation here is in reference to the 4 octets being made up of one byte each. The entire IP address breaks down into 32 bits ( diagram above).
Class B addresses range from 128.0.0.0 – 191.255.255.255. So for example, 172.16.0.1 starts with a 172 so it is a Class B address. Class B addresses use 16 bits to represent the network address and 16 bits to represent the individual hosts. So with Class B I could have 16,384 individual networks with each network containing over 65,000 host devices.
Class C addresses range from 192.0.0.0 – 223.255.255.255. So for example, 201.35.0.1 starts with a 201 so it is a Class C address. Class C addresses use 24 bits to represent the network address and 8 bits to represent the individual hosts. So with Class C I could have over 2 million individual networks with each network containing over 256 (actually 254) host devices.
We won’t get into Class D or E.
Class A Typically use a subnet mask of 255.0.0.0 255 = 8 consecutive 1 bits followed by 24 consecutive 0 bits is often known as “/8”
Class B Typically use a subnet mask of 255.255.0.0 255.255 = 16 consecutive 1 bits followed by 16 consecutive 0 bits is often known as “/16”
Class C Typically use a subnet mask of 255.255.255.0 255.255.255 = 24 consecutive 1 bits followed by 8 consecutive 0 bits is often known as “/24”
This is what is known as CLASSFUL Addressing. This basically meant if 192.168.1.1 was your IP address, then 255.255.255.0 was your subnet mask. Automatic, no ifs ands or buts.
Classless and Classful Addressing
But once IP addresses started to dwindle in availability, we saw how wasteful this addressing scheme really can be. So today, it is not required and most networking people have abandoned it. We can instead use CLASSLESS addressing. But, you don’t really want to mix methods as it can be very confusing and frustrating.
So with CLASSLESS it is now commonplace to see a mix of address classes and subnets. So your example of 192.168.1.2 with a subnet of 255.255.0.0 is a perfectly acceptable CLASSLESS address. So the whole idea of Class A, B, and C are not terribly relevant with the classless addressing scheme.
Your address of 192.168.1.X with a subnet of 255.255.0.0 is simply saying that this is a network identified as 192.168.0.0. The first IP address in the range is known as the network address. The mask is identifying that the last address on your network would be 192.168.255.255. Now the very first address and the very last are reserved so (256 x 256) – 2 = 65,534 devices could all be on the same network. That is potentially a very large network. One device sending a broadcast message would go to all of those devices.
Your address of 192.168.1.X with a subnet of 255.255.255.0 is saying that this is a network identified as 192.168.1.0. The mask is identifying that the last address on your network would be 192.168.1.255. So 254 devices. That is a much smaller network. One device sending a broadcast message would be contained to only go to those devices. 192.168.0.0 would be a completely separate network as would 192.168.2.0 and so on.
But what if your network didn’t require 250+ devices. What if it only needed to handle 10 devices. If we assigned 192.168.1.x with a subnet of 255.255.255.0 we would potentially be wasting 240+ IP addresses that we could use elsewhere.
Subnet Mask
So the mask of 255.255.255.0 is typically referred to as “/24” as it represents 24 consecutive 1 bits representing the network. The remaining 8 zero bits is where we get how many hosts we can have. But if we change how many network bits are used then we can affect how many host bits are available. So are not stuck with 256 or 65,000 as our only choices.
255.255.252.0 or /22 = 1024 (-2 reserved) hosts per network 255.255.254.0 or /23 = 512 (-2 reserved) hosts per network 255.255.255.0 or /24 = 256 (-2 reserved) hosts per network 255.255.255.128 or /25 = 128 (-2 reserved) hosts per network 255.255.255.192 or /26 = 64 (-2 reserved) hosts per network 255.255.255.224 or /27 = 32 (-2 reserved) hosts per network 255.255.255.240 or /28 = 16 (-2 reserved) hosts per network 255.255.255.248 or /29 = 8 (-2 reserved) hosts per network 255.255.255.252 or /30 = 4 (-2 reserved) hosts per network
So using /28 as our mask we can “sub-network” a typical range into many separate networks.
We could have the network start at 192.168.1.0 and end at 192.168.1.15 We could have another network start at 192.168.1.16 and end at 192.168.1.31 We could have another network start at 192.168.1.32 and end at 192.168.1.47 etc, etc…..
This idea of sub-netting is much more common in the IT world where they have a set number of IP addresses available and they cannot be wasted through a wasteful addressing scheme. In the controls world, we typically have had relatively small networks that have been isolated from the enterprise so our addressing methods didn’t really matter all that much. Today though we are seeing our control networks connecting to the enterprise network and knowing these addressing schemes becomes quite important.
So I have gone on much longer than I intended and I am sure I lost people along the way. But I wanted to make sure we understand that classless addressing is here to stay which makes the whole idea of Class A, B, and C mostly irrelevant.
The industrial automation world is increasingly connected. One of the projects this week involved a remote desktop session with a customer in the Midwest , from my NC location. The two of us were trying to log in to a PLC located in Alabama through a cloud based service. This is when I realized the utility of the multi IP setting on gateway devices.
An increasing number of PLC, drives and HMI’s include Ethernet based protocols as standard. Many also allow program updates via the ethernet connection. This makes it easier to implement remote access solutions for troubleshooting and maintenance purposes. Set up the IP addresses for the control devices, use a gateway device from eWon, InHand Networks or Netbiter and you’re ready to go.
The Reason for Multiple IP Subnets on the Remote Network
Our PLC on this project was a Modicon M251. On this setup, for various reasons, the PLC program download for the M251 had to be through the Ethernet 1 port( M251 has two separate Ethernet networks embedded). The field devices connected to it ( drives, HMI) were on Ethernet 2. The customer wanted to retain access to the webservers of the field devices when they connected remotely. Occasionally they also needed to log in to the PLC and update the program.
So, in short, we had to connect to Ethernet 1 of the PLC but the gateway device had its IP settings set to the Ethernet 2 port.
To illustrate the setup:
Drives, HMI and PLC Ethernet network 2 located on the 192.168.3.xx subnet
PLC program download port on Ethernet network 1 located on 192.168.4.xx subnet
Multi IP setting on IG601
This is where the InHand IG601 multiple IP LAN could be useful. Typically, the gateway device would need to set to the same IP subnet as the PLC, HMI or remote network. When there are multiple subnets in the remote network then the gateway device would have to be changed to access each of the subnets. The IG601 solves this as it can be set up with multiple IP addresses. Both M251 ethernet networks were set up with the corresponding gateway IP address on the IG601 as the gateway address:
Ethernet 1 at 192.168.4.3 was set up to look at 192.168.4.1 which was set up as one of the IP’s on the IG601.
Ethernet 2 at 192.168.3.3 was set up to look at 192.168.3.1 which was set up as the other IP on the IG601.
In the IG601 configuration, the multi-IP setting is easily setup in the Network>LAN settings.
The multi-IP feature was tested on my test setup and worked well.
Items to look out for during the M251/SoMachine and InHand IG601 setup
1. If the M251 IP address is altered, it may take a power cycle for it to take effect. If possible, set this up and test it before shipping the PLC or while onsite with it.
2. The gateway IP address needs to be set up on the M251 for both ports- Ethernet 2 and Ethernet 2. On this note, try to set and follow rules of setting the gateway IP address on your remote systems. Example : use xxx.xxx.xxx.1 for the gateway IP …etc.
3. The setup of the IG601 was covered in a previous postabout connecting to a Modicon M241. Having done this twice before, I still slipped up with one setting on the IG601. That is to set the cellular Access Number to *99***1# instead of leaving it blank. Not sure what this means but the system registered on the AT&T network after that setting was made.
Hope this helps save a controls engineer some energy and potentially hours/days of travel time just to perform a PLC program update or some troubleshooting. Thank you to the folks at InHand Network for their guidance on this back when I first set it up.
Amazingly, I went through this post without saying IoT or IIoT once. 🙂
Drop a line in the comments section below with questions or comments on this setup.
There are many ways to implement variable declaration in CODESYS. It can be easy to forget the syntax or specifics on some of them. This post covers them for reference. Also, a couple of programmer cautionary comics from XKCD at the bottom… 😀
Variable Declarations:
VarName : INT ;
Variable with located memory address
VarName AT % MW123: INT;
Variables with Initial Value:
VarName : INT := 23;
Variable initial values can be tied to another variable of the same data type:
VarName: INT:= VarName2;
where:
VarName2:= INT;
Declaring STRING with defined length:
VarName2 :STRING(40);
With the above, a string of 40 characters is created. Each character is one byte.
Declaring STRING with initial assignment:
VarName :STRING:= ‘HELLO WORLD’;
Declaring Arrays with Initial Value:
Array1: ARRAY[1..5] OF INT := [1,2,3,4,5];
Without initial value it would just be:
Array1: ARRAY[1..5] OF INT;
Some other notes about arrays:
The first element can be element zero, i.e.
Array1: ARRAY[0..5] OF INT;
Multi-dimensional Arrays:
Array1: ARRAY[0..5,0..2] OF INT;
Array1: ARRAY[0..5,0..2,0..4] OF INT;
Declaring Pointers:
PointerToStrArray : POINTER TO STRING ( 9 );
Declaring Pointers to Arrays:
PointerToStrArray : POINTER TO ARRAY[1..10] OF STRING ( 9 );
In both the pointer examples above, the pointer values can be loaded with the ADR function. More on that here.
Declaring Function Blocks with Inputs:
Declaring an OFF delay timer from the Standard library with an initialized preset time
OffDelayTimer: TOF:= (PT:=T#2S);
The above declaration method can also be used with the preset time tied to another variable of type time:
OffDelayTimer: TOF:= (PT: = PresetTime);
where the PresetTime is declared as follows:
PresetTime: TIME := T#2s;
One of the positive points of a textual variable declaration area is the option to copy and paste. In some programming environments, the alternate to a textual declaration is a tabular or table based variable declaration area. Some table based ( or tabular) variable areas might include a pull-down menu of options for each declaration. This may help someone who is beginning to learn in an environment.
Nevertheless, in the long term, textual declarations are more flexible. Another benefit is opens up the option to generate the variable declaration externally- in Excel for example. The external declaration is useful for larger projects with multiple programmers. In Excel, a name can be created and multiple versions of a variable generated with prefixes or suffixes to that name. One example may be:
For a variable called SysRun:
The local variable could be SysRun_Local
The status to be fed to a SCADA system could be SysRun_SCADA
Instead of typing out: SysRun_Local: BOOL; and SysRun_SCADA: BOOL; , the entire declaration process can be automated in Excel and then copied and pasted into CODESYS.
To wrap up for now..
Comments in variable declaration field are important. It helps the next person who reads the code/program. It might even help you make sense of your work, in the future. Also, for function blocks, the comments on the same line as a variable become the description of input pins when the cursor hovers over a pin.
There are probably other useful points and methods of variable declarations in CODESYS that are not included here. If one comes mind, please comment below.
This is part 3 of the PLC programming quickstart. The checklist continues with items 5 and 6. This part will cover PLC programming tools in the development environments . To recap the items covered in the previous two parts.
I/O Declaration: Find the methods and location of I/O declaration for the PLC program.
PLC Logic: Check on the location of program organization units (POU’s) . Check on applicability of programs, functions and function blocks.
Task Configuration:Are the POU’s to be executed organized by task. If so, check on the location functionality of the task manager.
This part will cover 2 more items. Step 5 is to explore the general environment and program language editors. Step 6 is the function in the environment.
5. Environment, Editors, Toolbars
There is often more than one way to do things in the programming environment. Get to know the locations and options of the tools and editor specific functions.
A good starting point is usually the toolbox and toolbars. In SoMachine and CCW, selecting View in the menu bar at the top yields a selection of toolbars and functions available in the environment.
In SoMachine and CCW, the toolbox shows up on the right side of the screen.
The other option for adding objects into a program is using the object icons in the toolbar at the top, below the menus.
Another place to check is the contextual options available when using the right click button. For example, in the ladder environment, right clicking in a rung ( or network as it is referred to in IEC terminology) brings up the objects that can be added.
This also applies to other parts of the environment. For example, right clicking in the device directory brings up items that can be added in a specific context.
This shows us there are often multiple ways to accomplish the same outcome. An coil can be added by dragging and dropping it from the toolbox. A coil can be added by right clicking on the rung/network. A coil can be added from the menu bar at the top.
The right click also pulls up some contextual options in the CCW environment.
Find the way that you feel most comfortable using. There is no right and wrong to it.
6. Functions and libraries
Any task becomes harder without the right tools. For a long time, I was re-creating a periodic ON-OFF function using two timers until I discovered a function called BLINK in CODESYS. The same applied to a simple scaling function block. I later found one already built into SoMachine. The moral of the story is to figure out what is available in the environment early. It will save time and effort. It will reduce the amount of code that gets written.
There are a set of functions that are used in most PLC programs. These include timers, triggers and PID function blocks. Knowing where these functions are and how they are used is next on this checklist.
To find the basic functions:
check toolbox from previous step.
if there is a library manager, check the libraries
review the help files
For instance, in SoMachine, the Util and Toolbox libraries are worth a review. They contain functions to simplify programming..scaling, limit checking, PID,…
They are located in the Library Manager.
Final point about familiarizing with a PLC environment, browse through the help files. There may be details about implementing different functions. The structure of the help files in SoMachine and CCW includes a content list and a search function. Browse through the content list. If anything, this may show you the functions and terminology in the environment.
In summary, the tools and functions in a PLC programming environment will make or break the programming experience. Some key steps on getting up to speed:
Familiarize yourself and explore the environment prior to starting a project.
Exploration will include clicking (including right clicks : 0) through all the functions, object and menus on-screen.
Browse through the functions libraries and toolboxes.
Browse through the help files.
If a question comes up while doing the above, note it down. Check with the vendor or refer to any example projects that may be available.
The PLC programming quickstart checklist is intended for a user to learn a new PLC programming environment. This applies to users who have programmed PLC’s before and also for someone new to PLC’s. Continuing from part 1 with checklist item 3:
3. Program logic
This is where the code is going to be.
IEC 61131-3 is the reference standard for PLC programming languages. In 2016, all major PLC platforms have some level of compliance to this standard. The standard does allow for partial compliance and requires manufacturers to declare specfics of their compliance with a statement. A quick introduction to the standard is available at the PLCopen site.
Per the standard, logic can be written as one of the following 3 types of program organization units (POU’s):
Programs
Functions
Function Blocks
PLCopen covers an overview of these types in a presentation here.
Adding these POU’s to the program usually occurs on the left side of the screen. There are some differences on how this is done in various environments.
In SoMachine which uses CODESYS V3, a POU is added by right clicking the Application directory and selecting Add Object>> POU. Subsequently, the option to add a Program, Function or Function Block pops up.
The POU types and options do vary in terminology and operation from platform to platform. In CCW, the Programs are added under the Program directory header. Function blocks are added under a separate header called User Defined Function Blocks.
When adding a program, the user is usually prompted to define the language chosen for that POU. When playing with a new environment, here is where you will find out the languages supported ( other than in the literature).
It would be advisable to select the different languages and test drive them. At the very least, select the language you will use and play around with the development environment. A later part will cover the specific items to look for in the language chosen.
Some questions to ask, that does vary from platform to platform is:
Can a program call another program?
When a function block is updated, does it automatically update every instance?
Can program execution order be arranged?
The final question takes us to checklist item 4…
4. Task Configuration
The importance of a ‘task’ is that it gives the PLC programmer control over what parts of the code to run and when. Task configuration covers the order , timing and triggers of execution. For example,
A cyclic task may be configured to execute every 20ms.
An acyclic, freewheeling task may be set to occur per the processor execution cycle for the POU as defined.
An event triggered task may run only when an input is triggered.
If a part of the code needs to have a higher priority over other parts, it may be defined in a task of its own. It could also be set to execute with a shorter cycle time, if required.
SoMachine tasks are configured under the Task Configuration header. Multiple tasks can be defined with the number varying based on the specific PLC used. CCW does not have a specific task configuration section. Programs noted in programs section are executed in order. The order can be changed, as required. CCW does have an interrupt option that can be used to trigger specific logic as required.
Key takeaway here is to note the differences in the number of tasks and sequencing options for programs/POU’s in various environments.