# Horner XL4 Math Instructions

Math instructions in the Horner APG XL4 OCS all-in-one controller are broken down into Basic Math Operations and Advanced Math Operations.
Basic Math Operations include the following:
Math Equation Element, Add, Subtract, Multiply, Divide, Modulo, Square Root, Absolute Value
Advanced Math Operations include the following:
Power of X, Base 10 Logarithm, Power of e, Natural Logarithm, Sine, Cosine, Tangent, Inverse Sine, Inverse Cosine, Inverse Tangent, Convert to Radians, Convert to Degrees, Scale

We will be looking at the expression and scaling math functions. Continue Reading!

# Horner XL4 Compare and Move Instructions

Compare and move instructions in the Horner XL4 OCS all-in-one controller can be very powerful. We will be looking at how to use these instructions. Combining these two instructions to build a sequencer, we will apply this to an application example. Our application will be a simple traffic light. The HMI screen will show a picture of each of the lights. Continue Reading!

# The 7 Essential Parts of a PLC System

When I was in school PLC’s were just in their infancy. We were taught that the PLC consisted of the central processing unit (CPU), analog and digital inputs and outputs. Everything was programmed with dedicated handheld devices and/or software devices on specialized hardware. We now have modern PLC systems that are capable of so much more. Let’s look at how we can now break up these modern PLC system into the seven essential components.

CPU
Inputs and Outputs (I/O)
Analog I/O
Specialty I/O
Programming Tools
HMI

# Horner XL4 Cscape Software Setup

The Horner XL4 OCS all-in-one controller is programmed using Csape. Cscape (Control Station Central Application Programming Environment) We will now setup the Cscape software so we can easily communicate and program our controller. Continue Reading!

# Horner XL4 System Hardware

The Horner XL4 OCS is an All-in-one controller. This means that this modern unit combines a logic controller, operator interface, I/O and networking all into one package. This OCS (Operator Control Station) family was first released in 1998. New features to the line-up have been added over the years. Today the OCS family has a very competitive advantage as you will soon see.
Programming is done with a single programming software package. Cscape (Control Station Central Application Programming Environment) is designed to be easy to use and maintain.

This series on the Horner XL4 all-in-one controller (PLC) will go step by step through learning how to use this innovative unit. Continue Reading…

# Click PLC Shift Register Instruction

Allot of times when programming a PLC you need to track what has previously happened. Shift registers allow you to do just that. The Click PLC has a shift register in the instruction set. We will discuss the shift register and look at an example.  Keep on Reading!

# Click PLC Installing the Software

Previously we discussed the Click PLC System Hardware. Today we will be installing the free software required to program the PLC. This includes the actual program and communication drivers.  Keep on Reading!

# Click PLC System Hardware

Many people ask me what I do when looking at a new PLC model or system. My approach is very straight forward and we will view this in action with this Click PLC series. This series will go from examining the hardware to programming and communicating to the PLC in several ways. If you have questions along the way, please let me know. Keep on Reading!

Deploying an AdvancedHMI project on the industrial floor sounds like an easy task, but there are a few things that you should consider. The HMI (Human Machine Interface) user interface will run on a computer. The industrial environment is one in which temperature, dust, electrical noise, etc. are always present. This can also be combined with workers wanting to play with the new computer. We will look briefly at the hardware and software items that will make your install more reliable and user friendly in the field.

Hardware
The hardware that you deploy in the field should match the environment that you expect it to work in. Computers come in many shapes, sizes and price points. Here are a few items that you may want to consider.

• Fanless Computer – This will keep the dust out but temperature may be a problem.
• Monitor – Location and type – Do you need touch screen?
Keyboard and mouse – Washable?
• Enclosures – If you are in a wash down environment then an enclosure is a necessity. Sometimes these enclosures are worth more than the contents in them.
• UPS – The uninterruptable power supply will usually serve two purposes. It will act when power is removed so the computer will be able to shutdown correctly. The UPS will usually also act as a power conditioner. Most power has surges on the line and this can be amplified when in the industrial environment. The surge suppressors in the UPS will protect the computer.
• Program backup – Have multiple copies of the software saved in different places. You never know when the unexpected will happen. (Fire / Thief etc.) This includes the backup disks for your operating system as well as the programs (versions) that you are running on the computer. (AdvancedHMI, Visual Studio)
• Documentation of the backup (Hardware / Software) – Ensure that you have documentation of the hardware and software versions that you are using. I would also include where everything was purchased. This way if records are missing we can track this down through the supplier.

Software
The software that we have on the production floor should be robust. This means that we should know what happens if thing go wrong. Backups as mentioned above should happen on a regular basis. Memory is inexpensive so backup your files regularly. We usually use a networked computer to automatically back up the production files each day. The following is a list of items that you should pay attention to when deploying a computer on the production environment.

• Turn off windows update – Windows is great at keeping itself up to date. However this can cause programs to stop working. When dealing with an AdvancedHMI deployment we set windows to ‘Download updates but let me choose whether to install them’. It can take several minutes for windows to update. You want to be sure that the machine being controlled will not be affected.
• Security – Set permissions – When setting up your windows computer for the factory floor, do not give the account that boots up and logs on automatically Administrator Privileges. It should be set up as a Standard User. This will prevent unauthorized software being loaded onto the system.
Internet Explorer comes standard on any new computer with windows 8.1 or older. No other browser is present out of the box. It is good to set a supervisor password on the internet connection. This will allow you to restrict the internet use.
On the run prompt type: RunDll32.exe msrating.dll,RatingSetupUI
Goto the General tab to select a supervisor password
• AdvancedHMI – There are a few thing that we can do in the AdvancedHMI project. We will look at the AdvancedHMI project that we did for Creating a HMI Login Screen on AdvancedHMI.

o ControlBox – Remove the ControlBox on the main screen form. This will ensure that the user cannot minimize, maximize or close the application.

o Maximize for screen size – Make the main screen form maximized so it will fill the entire screen.

o Form.TopMost = True – This command will ensure that your application will be on top of all other windows forms.

In this example the calculator has focus, but the our windows form will always be on top.

If you have only one form then you can use the Properties settings for the form you always want on top. Multiple pages will have to include some additional programming to ensure that they are on top and visible.
Here is the code for the returning to the main form of the program.
```Private Sub ReturnToMainButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
Me.TopMost = False
MainForm.Show()
MainForm.TopMost = True
Me.Hide()
End Sub```
• Shortcut on the desktop – Place a shortcut to the AdvancedHMI application on the desktop. This will allow someone to quickly start the application if the application unexpectedly closes.

Following the above recommendations will ensure that your computer will perform and last as expected on the factory floor. Your AdvancedHMI project will work reliable and efficiently.

If you would like a copy of the PLC and AdvancedHMI programs, please contact me and I would be happy to send them to you.

Thank you,
Garry

Archie Jacobs from Manufacturing Automation, LLC  has another tip for disabling the windows error recovery on startup.
On the PC that will run AdvancedHMI, click the start button and type CMD to find the Command Prompt. Right Click on the command prompt and select Run As Administrator
Once the Command Prompt opens, type the following:
bcdedit /set {current} bootstatuspolicy ignoreallfailures
This will prevent problematic startup when the PC is not shut down properly as often happens in the industrial environment.

If you’re like most of my readers, you’re committed to learning about technology. Numbering systems used in PLC’s are not difficult to learn and understand. We will walk through the numbering systems used in PLCs. This includes Bits, Decimal, Hexadecimal, ASCII and Floating Point.

To get this free article, subscribe to my free email newsletter.

Use the information to inform other people how numbering systems work. Sign up now.

# Modbus TCP Data Logging to Database

Using Visual Basic 2015 we will log three holding registers from the PLC along with time and date into a Microsoft Access Database. We will log every minute into the database with the information that we collect from the PLC via Modbus TCP (Ethernet). All code will be done and shown so you can implement this in your application with different parameters. The information collected in the database can then be distributed or analyzed in the future.

Visual Basic 2015 will be used with the EasyModbusTCP client/server library for .net. We will communicate to an Automation Direct – Do-More PLC. Using the free simulation software of the PLC Designer Software, we will retrieve three values of the Modbus Holding Registers using Modbus TCP. Once we have this information out of the programmable logic controller it will be placed in a Microsoft Access (2010) Database. This will be done by using a SQL command to insert the data.

Automation Direct has a powerful simulator with their Do-More PLC. The PLC software is available from Automation Direct as a free download.
http://support.automationdirect.com/products/domore.html

We will start with the PLC program. The first  three holding registers will be used. That will be MHR1, MHR2 and MHR3 in the Do-More PLC. This will correspond to register numbers 40001, 40002 and 40003. The following is a table with all of the references for Modbus communications to the Do-More.

 Coil/Register Numbers Data Addresses Type Do-More PLC Table Name 00001-09999 0000 to 270E Read-Write MC1 to MC1023 Discrete Output Coils 10001-19999 0000 to 270E Read-Only MI1 to MI1023 Discrete Input Contacts 30001-39999 0000 to 270E Read-Only MIR1 to MIR2047 Analog Input Registers 40001-49999 0000 to 270E Read-Write MHR1 to MHR2047 Analog Output Holding Registers

Note: The Do More PLC uses the Modbus area to communicate. This is because having direct access to the digital I/O can be dangerous when connected via Ethernet to the internet. Data must move in and out of this area via the PLC program.

Here is the PLC program that sets the three registers.

The next thing to do is set up our Microsoft Access 2010 Database. Our database will be named ACC_Database and it will be located at the following location: “C:\AccLog”. We will have one table called ACC_Log. In the table we will have five fields; LogDate, LogTime, Register1, Register2, Register3.

Visual Basic 2015 is free and is part of Visual Studio 2015. It can be downloaded at the following location:
https://www.visualstudio.com/en-us/products/visual-studio-community-vs

EasyModbusTCP is free software. It will be referenced in our visual basic program.  It can be downloaded from the following location:
https://sourceforge.net/projects/easymodbustcp/

EasyModbusTCP is a Modbus TCP, Modbus UDP client/server library for .NET and Client library for JAVA. .NET (.dll) Client/Server also supports Modbus RTU. It supports the following function codes: – Read Coils (FC1)
– Write Single Coil (FC5)
– Write Single Register (FC6)
– Write Multiple Coils (FC15)
– Write Multiple Registers (FC16)

Now we will call up visual studio and create our project. The first thing that we must do is reference our EasyModbus.dll file.

Our program will log the three registers based upon a timer function. When the time expires we will set the interval to 1 minute and call a subroutine (Button1). This subroutine will communicate to the PLC via Modbus TCP and get our three registers. It will then insert the data from the registers along with the time and date into an access database.

Here is what our visual basic form will look like:

Here is the visual basic code for our project. We use the Imports command for the EasyModbusTCP namespacing.

`Imports EasyModbus 'Import the EasyModbus `

Here is the part of the subroutine that will communicate to the PLC via the EasyModbusTCP, You will notice that we have used the ‘Try’ command on the ModbusClient.Connect() statement. This way we can track if we are communicating or not to the PLC.

```Public Class Form1
Private Sub Button1_Click() Handles Button1.Click
'This subroutine will communicate using the EasyModbusTCP to the PLC
'This will execute when the user clicks the button or at specific intervals from the Timer1
Dim ComError = 0 'Set communication error flag to 0
'Specify the IP Address and Port Number that we are connecting
Dim ModbusClient As EasyModbus.ModbusClient = New EasyModbus.ModbusClient(TextBox1.Text, 502)
Try
ModbusClient.Connect() 'Connect to the PLC
Catch ex As Exception 'What to do when an error occurs
Label10.ForeColor = Color.Red
Label10.Text = "Communication Error!"
ComError = 1 'Set communication error flag to 1
End Try
If ComError = 0 Then 'Do the following when communication is OK
Label10.ForeColor = Color.Black
Label10.Text = "Logging..."
Dim Registers As Integer() 'Where to store the information
Registers = ModbusClient.ReadHoldingRegisters(0, 3) 'Read three registers starting at the first one
Label1.Text = Registers(0) 'Value of MHR1
Label2.Text = Registers(1) 'Value of MHR2
Label3.Text = Registers(2) 'Value of MHR3
ModbusClient.Disconnect() 'Disconnect from the PLC
```

Here is the code to open the database connection and insert the data into our ACC_Database file. We use the ‘Try’ command to ensure that if errors occur it will not stop our program. The connection string ( Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\AccLog\ACC_Database.accdb) may be different then yours. In order to get your connection string, please review the following from a previous post and search for connection string.

```'Log values into an Access Database
'We will use a SQL instruction to insert a record into the table
Try
Dim SQL As String 'SQL Command String
Dim objCmd As New OleDb.OleDbCommand 'Command
'Connection String to the Access Database
Dim Con = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\AccLog\ACC_Database.accdb")
'SQL Statement - All values must be set for the table
SQL = "INSERT INTO ACC_Log VALUES ('" & Now.ToString("yyyy/MM/dd") & "', '" & Now.ToString("hh:mm:ss") & "', '" & Registers(0) & "', '" & Registers(1) & "', '" & Registers(2) & "')"
Con.Open() 'Open the database connection
objCmd = New OleDb.OleDbCommand(SQL, Con) 'Set the command
objCmd.ExecuteNonQuery() 'Execute the SQL command
Con.Close() 'Close the database connection
Catch ex As Exception 'What to do when an error occurs
Label10.ForeColor = Color.Red
Label10.Text = "Database Error!"
End Try
End If
End Sub```

This timer is originally set for 100ms. When the program starts, it will log the first time and then set the timer interval to 1 minute. (60000ms)

``` Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Label9.Text = Now 'Display time and date
Timer1.Interval = 60000 'Set interval for 1 minute
Timer1.Enabled = True
Call Sub() Button1_Click() 'Call the routine to get the PLC information and store in a database
End Sub```

This will handle the LinkLabel on the form.

``` Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
' Specify that the link was visited.
' Navigate to a URL.
System.Diagnostics.Process.Start("http://www.accautomation.ca")
End Sub
End Class```

Running the program:
The status will show ‘Initializing..’ so that the imports can be loading in the program. This will happen each time the software starts.

Logging will be displayed in the status to indicate that everything is working correctly.

Error messages will show in the status when an error has occurred. We have programmed two errors:
Communication Error! – Information is not being received from the PLC. This could be due to the wrong IP address or communications links have been broken.
Database Error! – Information cannot be written into the database, the database is not present, etc.

Here is what our database looks like after collecting a few samples.

As you can see, collecting information from the PLC via ModbusTCP and inserting it into an Access database can be easily done. The next steps would be to ensure that the data is always collected. What happens when the communication to the PLC is cut? Robust logging is required. This is when we create a buffer in the PLC of the logged values. Please refer to our EBook ‘Robust Data Logging for Free’ .

Download the sample database, visual basic and PLC code for this project here.

Watch on YouTube : Modbus TCP Data Logging to Database