Back
Featured image of post Automation virtual commissioning : PLCSIM advanced 2.0 with Csharp

Automation virtual commissioning : PLCSIM advanced 2.0 with Csharp

This is a demonstration of a co-simulation between Siemens PLCSIM Advanced and C#

This is is a short demonstration of a co-simulation between Siemens PLCSIM Advanced and C#. The goal is simple : have the ability to conditionally change inputs.We’ll do a proof of concept with a small exemple for a safety relay monitored by a feedback.

Configuration

We’ll run the simulator and the editor on two computers :

Network configuration
Network configuration

Simulator configuration

First let’s start an instance with the following parameters :

Instance parameters for PLCSIM advanced
Instance parameters for PLCSIM advanced

Once started, it should be like that :

Simulation running
Simulation running

PLC Programming

Hardware configuration

Let’s do a simple configuration as follow :

Project hardware configuration
Project hardware configuration

Network configuration :

  • PLC_1 : 192.168.1.1/24
  • IO device_1 : 192.168.1.2/24

Note : On the simulator, we have different IP addresses for all the network interfaces : Ethernet adapter, PLCSIM virtual ethernet adapter, PLC and I/Os !

With the following I/Os :

Remote I/Os configuration
Remote I/Os configuration

Note that you’ll need to activate this option in the project settings :

Support simulation during block compilation option<
Support simulation during block compilation option<

Program

Our program will be very simple ! OB1 will toggle a bit every second :

OB1 block
OB1 block

And FB1 will do a safety check between the relay output and the input feedback :

FB1
FB1

Compiling and loading

You should be able to compile and load :

Compile and load program
Compile and load program

Simulation

As soon as you’ll run the program, you should have an error on the feedback monitoring :

Feedback error
Feedback error

Co-simulation

To solve this issue, we’ll running co-simulation with C#. The script will check the output value (%Q9.0) and set the feedback (%I0.0) accordingly. We’ll be using sharpdevelop as IDE.

Import DLL

Importing the DLL is easy :

Import DLL
Import DLL

Then we write a short program :

/*
 * Created by SharpDevelop.
 */
using System;
using System.Threading;
using Siemens.Simatic.Simulation.Runtime;

namespace CPU1515F
{
	class Program
	{
		public static void Main(string[] args)
		{
			Console.WriteLine("Starting simulation");
			//Use it for local instance
			//IInstance myInstance = SimulationRuntimeManager.CreateInterface("Golf8");

			//Use it for remote instance
			IRemoteRuntimeManager myRemoteInstance = SimulationRuntimeManager.RemoteConnect("192.168.1.101:50000");
			IInstance myInstance = myRemoteInstance.CreateInterface("1515F");
		
			//Update tag list from API
			Console.WriteLine("Tags synchronization");
			myInstance.UpdateTagList();
		
			//Start a thread to synchronize feedbacks inputs 
			Thread tFeedbacks = new Thread(()=&gt;synchroFeedbacks(myInstance));
			tFeedbacks.Start();
			
			//Allow the user to quit simulation
			Console.WriteLine("Simulation running");
			Console.WriteLine("Press any key to quit . . . ");
			Console.ReadKey(true);
		}
		
		static void synchroFeedbacks(IInstance myInstance)
        {
			while(true){
				//Keep %I and %Q opposite
				myInstance.WriteBool("FB_KA1", !myInstance.ReadBool("KA1"));	
			}
		}
	}
}

And run it :

Simulation running
Simulation running
Once acknowledged, we should not have any issue.

Using the trace tool, we can confirm that it’s running perfectly fine, updating the input in around 100ms.

Simulation check 1
Simulation check 1

Simulation check 1
Simulation check 1

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy