倍福TwinCAT3上位机与PLC通信测试(ADS通信) 包含C#和C++代码
本次测试需要环境:
VS2013,TwinCAT3(本人版本TC31-Full-Setup.3.1.4018.16)
代码:C#代码,PLC程序代码,C++代码(官方提供)
测试部分:
测试包含:bool类型,int类型,long类型,real类型,lreal类型,string类型,数组,以及结构体 部分测试(这里没有结构体嵌套)
PLC程序Main程序
基本类型部分
代码:
PROGRAM MAIN VAR BoolTest :BOOL; IntTest:INT; LongTest:DINT; SingleTest:REAL; DoubleTest:LREAL; StringTest:STRING; readstringlen:INT; plcstruc :plcstructure; plcarraytest:ARRAY[1..5] OF INT; END_VAR
结构体程序部分
代码:
TYPE plcstructure : STRUCT plcs1:BOOL; dummy1:BOOL; dummy2:BOOL; dummy3:BOOL; plcs2:INT; dummy4:INT; plcs3:DINT; plcs4:REAL; plcs5:LREAL; END_STRUCT END_TYPE
C#程序主界面
主界面代码包含按钮事件等
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; //引用Twincat.ads和Sustem.IO using TwinCAT.Ads; using System.IO; namespace writeread { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //定义所需变量 private bool writebool =false; private bool readbool=false ; private short writeint = 0; private short readint = 0; private int writelong = 0; private int readlong = 0; private float writereal = 0; private float readreal = 0; private double writelreal = 0; private double readlreal = 0; private string writestring = ""; private string readstring = ""; private int stringlen = 0; //定义结构体类型 public struct structtype { public bool s1; public bool dummy1; public bool dummy2; public bool dummy3; public short s2 ; public short dummy4; public int s3 ; public float s4; public double s5 ; } //实例化结构体 private structtype structtest =new structtype (); //定义数组,含有五个元素 private short[] arraytest = new short[5]; //定义句柄变量 private int hvar = new int(); //通讯数据定义 private TcAdsClient tcclient;//定义通讯协议 private void Form1_Load(object sender, EventArgs e) { //通讯协议 tcclient = new TcAdsClient(); //tcclient.Connect("控制器NetID",851) tcclient.Connect(851); } //writebool private void button1_Click(object sender, EventArgs e) { if (writebool == true) { writebool = false; } else { writebool = true; } try { hvar = tcclient.CreateVariableHandle("MAIN.BoolTest"); tcclient.WriteAny(hvar ,writebool ); tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { } } //readbool private void button2_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.BoolTest"); readbool = (bool)(tcclient.ReadAny(hvar, typeof(bool))); tcclient.DeleteVariableHandle(hvar); label1.Text = readbool.ToString(); } catch (Exception err) { } } //writeINt plc int 对应c# short private void button4_Click(object sender, EventArgs e) { writeint =short.Parse (textBox2 .Text ); try { hvar = tcclient.CreateVariableHandle("MAIN.IntTest"); tcclient.WriteAny(hvar, writeint); tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { } } //readint private void button3_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.IntTest"); readint = (short)(tcclient.ReadAny(hvar, typeof(short))); tcclient.DeleteVariableHandle(hvar); label2.Text = readint.ToString(); } catch (Exception err) { } } //writelong private void button6_Click(object sender, EventArgs e) { writelong = int.Parse(textBox3.Text); try { hvar = tcclient.CreateVariableHandle("MAIN.LongTest"); tcclient.WriteAny(hvar, writelong); tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { } } //readlong private void button5_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.LongTest"); readlong = (Int32)(tcclient.ReadAny(hvar , typeof(Int32))); tcclient.DeleteVariableHandle(hvar); label3.Text = readlong.ToString(); } catch (Exception err) { } } //writereal private void button8_Click(object sender, EventArgs e) { writereal = Single.Parse(textBox4.Text); try { hvar = tcclient.CreateVariableHandle("MAIN.SingleTest"); tcclient.WriteAny(hvar , writereal); tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { } } //readreal private void button7_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.SingleTest"); readreal = (float)(tcclient.ReadAny(hvar , typeof(float))); tcclient.DeleteVariableHandle(hvar); label4.Text = readreal.ToString(); } catch (Exception err) { } } //writelreal private void button10_Click(object sender, EventArgs e) { writelreal = double.Parse(textBox5.Text); try { hvar = tcclient.CreateVariableHandle("MAIN.DoubleTest"); tcclient.WriteAny(hvar, writelreal); tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { } } //readlreal private void button9_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.DoubleTest"); readlreal = (double)(tcclient.ReadAny(hvar , typeof(double))); tcclient.DeleteVariableHandle(hvar); label5.Text = readlreal.ToString(); } catch (Exception err) { } } //writestring 按照ASCII码进行读写 private void button12_Click(object sender, EventArgs e) { writestring = textBox6.Text; stringlen = writestring.Length; try { hvar = tcclient.CreateVariableHandle("MAIN.StringTest"); tcclient.WriteAny(hvar, writestring, new int[] { 80 }); tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { } } //readstring private void button11_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.StringTest"); readstring = tcclient.ReadAny(hvar, typeof(string), new int[] { 80 }).ToString(); tcclient.DeleteVariableHandle(hvar); label6.Text = readstring; } catch (Exception err) { } } //writestruct private void button13_Click(object sender, EventArgs e) { if (structtest.s1 == true) { structtest.s1 = false; } else { structtest.s1 = true; } // structtest.s1 = bool.Parse(textBox7.Text); structtest.s2 = short.Parse(textBox8.Text); structtest.s3 = int.Parse(textBox9.Text); structtest.s4 = float.Parse(textBox10.Text); structtest.s5 = double.Parse(textBox11.Text); try { hvar = tcclient.CreateVariableHandle("MAIN.plcstruc"); } catch (Exception err) { MessageBox.Show("get hvar error"); } AdsStream datastream = new AdsStream(24); //4+4+4+4+8=24 BinaryWriter binwrite = new BinaryWriter(datastream); datastream.Position = 0; try { binwrite.Write(structtest.s1); binwrite.Write(structtest.dummy1 ); binwrite.Write(structtest.dummy2); binwrite.Write(structtest.dummy3); binwrite.Write(structtest.s2); binwrite.Write(structtest.dummy4); binwrite.Write(structtest.s3); binwrite.Write(structtest.s4); binwrite.Write(structtest.s5); tcclient.Write(hvar, datastream); structtest.s1 = false; structtest.s2 = 0; structtest.s3 = 0; structtest.s4 = 0; structtest.s5 = 0; } catch (Exception err) { MessageBox.Show("write value error"); } try { tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { MessageBox.Show(" write delect hvar error"); } } //readstruct private void button14_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.plcstruc"); } catch (Exception err) { MessageBox.Show("get hvar error"); } AdsStream datastream = new AdsStream(24);//4+4+4+4+8=24 BinaryReader binread = new BinaryReader(datastream); datastream.Position = 0; try { tcclient.Read(hvar, datastream); structtest.s1 = binread.ReadBoolean(); structtest.dummy1 = binread.ReadBoolean(); structtest.dummy2 = binread.ReadBoolean(); structtest.dummy3 = binread.ReadBoolean(); structtest.s2 = binread.ReadInt16(); structtest.dummy4 = binread.ReadInt16(); structtest.s3 = binread.ReadInt32(); structtest.s4 = binread.ReadSingle(); structtest.s5 = binread.ReadDouble(); label7.Text = structtest.s1.ToString(); label8.Text = structtest.s2.ToString(); label9.Text = structtest.s3.ToString(); label10.Text = structtest.s4.ToString(); label11.Text = structtest.s5.ToString(); } catch (Exception err) { MessageBox.Show("read value error"); } try { tcclient.DeleteVariableHandle(hvar); } catch (Exception err) { MessageBox.Show("read delect hvar error"); } } //writearray private void button15_Click(object sender, EventArgs e) { arraytest[0] = short.Parse(textBox12.Text); arraytest[1] = short.Parse(textBox13.Text); arraytest[2] = short.Parse(textBox14.Text); arraytest[3] = short.Parse(textBox15.Text); arraytest[4] = short.Parse(textBox16.Text); try { hvar = tcclient.CreateVariableHandle("MAIN.plcarraytest"); tcclient.WriteAny(hvar , arraytest); tcclient.DeleteVariableHandle(hvar); for (int i = 0; i < 5; i++) { arraytest[i] = 0; } } catch (Exception err) { } } //readarray private void button16_Click(object sender, EventArgs e) { try { hvar = tcclient.CreateVariableHandle("MAIN.plcarraytest"); arraytest = (short[])(tcclient.ReadAny(hvar , typeof(short[]), new int[] { 5 })); tcclient.DeleteVariableHandle(hvar); label12.Text = arraytest[0].ToString(); label13.Text = arraytest[1].ToString(); label14.Text = arraytest[2].ToString(); label15.Text = arraytest[3].ToString(); label16.Text = arraytest[4].ToString(); } catch (Exception err) { } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if(tcclient !=null) tcclient.Dispose(); } } }
C++程序代码项目(注意红色框里面的路径是TwinCAT的安装路径)
测试结果:
上位机:
PLC程序:
PLC程序运行动图:
测试完毕!
工程源文件下载地址
小伙伴们直接去这里下载:
https://files.cnblogs.com/files/JiYF/%E5%80%8D%E7%A6%8FTwinCAT3%E4%B8%8A%E4%BD%8D%E6%9C%BA%E4%B8%8EPLC%E9%80%9A%E4%BF%A1%E6%B5%8B%E8%AF%95(ADS%E9%80%9A%E4%BF%A1)%E4%BE%8B%E5%AD%90%E4%BB%A3%E7%A0%81.rar
注意事项:
string类型如果没有限定大小,默认是80个字符,在C#这里需要加一个字符为结束符也就是限定为81个字符
例如:
介绍: