倍福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個字符
例如:
介紹: