实例介绍
【实例简介】
C#winform与西门子1200、1500系列PLC通讯实例
【实例截图】
【核心代码】
using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Sharp7; namespace CSClient { public partial class MainForm : Form { private S7Client Client; private byte[] Buffer = new byte[65536]; private byte[] DB_A = new byte[1024]; private byte[] DB_B = new byte[1024]; private byte[] DB_C = new byte[1024]; private void ShowResult(int Result) //状态栏结果显示 { // This function returns a textual explaination of the error code TextError.Text = Client.ErrorText(Result); if (Result == 0) TextError.Text = TextError.Text " (" Client.ExecutionTime.ToString() " ms)"; } public MainForm() { InitializeComponent(); Client = new S7Client(); if (IntPtr.Size == 4) this.Text = this.Text " - Running 32 bit Code"; else this.Text = this.Text " - Running 64 bit Code"; CBType.SelectedIndex = 0; CBArea.SelectedIndex = 3; CBWLen.SelectedIndex = 1; CBBlock.SelectedIndex = 1; tabControl.Enabled = false; } private void ConnectBtn_Click(object sender, EventArgs e) //连接PLC { int Result = 1; int Rack = System.Convert.ToInt32(TxtRack.Text); int Slot = System.Convert.ToInt32(TxtSlot.Text); Result = Client.ConnectTo(TxtIP.Text, Rack, Slot); ShowResult(Result); //状态栏结果显示 if (Result == 0) { TextError.Text = TextError.Text " PDU Negotiated : " Client.PduSizeNegotiated.ToString(); //状态栏结果追加文本 TxtIP.Enabled = false; TxtRack.Enabled = false; TxtSlot.Enabled = false; ConnectBtn.Enabled = false; DisconnectBtn.Enabled = true; tabControl.Enabled = true; } else MessageBox.Show("连接PLC失败"); } private void DisconnectBtn_Click(object sender, EventArgs e) //断开PLC连接 { Client.Disconnect(); TextError.Text = "Disconnected"; TxtIP.Enabled = true; TxtRack.Enabled = true; TxtSlot.Enabled = true; ConnectBtn.Enabled = true; DisconnectBtn.Enabled = false; tabControl.Enabled = false; } private void ReadBtn_Click(object sender, EventArgs e) //读Area { ReadArea(); } private void button2_Click_1(object sender, EventArgs e) //Set { int Result = Client.WriteArea(S7Consts.S7AreaCT, 0, 1, 3, S7Consts.S7WLCounter, Buffer); ShowResult(Result); //状态栏结果显示 } private void FieldBtn_Click(object sender, EventArgs e) //Field Get { /* 0 Byte 8 Bit Word (All) 1 Word 16 Bit Word (All) 2 DWord 32 Bit Word (All) 3 LWord 64 Bit Word (S71500) 4 USint 8 Bit Unsigned Integer (S71200/1500) 5 UInt 16 Bit Unsigned Integer (S71200/1500) 6 UDInt 32 Bit Unsigned Integer (S71200/1500) 7 ULint 64 Bit Unsigned Integer (S71500) 8 Sint 8 Bit Signed Integer (S71200/1500) 9 Int 16 Bit Signed Integer (All) 10 DInt 32 Bit Signed Integer (S71200/1500) 11 LInt 64 Bit Signed Integer (S71500) 12 Real 32 Bit Floating point (All) 13 LReal 64 Bit Floating point (S71200/1500) 14 Time 32 Bit Time elapsed ms (All) 15 LTime 64 Bit Time Elapsed ns (S71500) 16 Date 16 Bit days from 1990/1/1 (All) 17 TOD 32 Bit ms elapsed from midnight (All) 18 DT 8 Byte Date and Time (All) 19 LTOD 64 Bit time of day (ns) (S71500) 20 DTL 12 Byte Date and Time Long (S71200/1500) 21 LDT 64 Bit ns elapsed from 1970/1/1 (S71500) */ int Pos = System.Convert.ToInt32(TxtOffset.Text); switch (CBType.SelectedIndex) { case 0: { TxtValue.Text = "16#" System.Convert.ToString(Buffer[Pos], 16).ToUpper(); break; } case 1: { UInt16 Word = S7.GetWordAt(Buffer, Pos); TxtValue.Text = "16#" System.Convert.ToString(Word, 16).ToUpper(); break; } case 2: { UInt32 DWord = S7.GetDWordAt(Buffer, Pos); TxtValue.Text = "16#" System.Convert.ToString(DWord, 16).ToUpper(); break; } case 3: { UInt64 LWord = S7.GetLWordAt(Buffer, Pos); TxtValue.Text = "16#" System.Convert.ToString((Int64)LWord, 16).ToUpper(); // <-- Convert.ToString does not handle UInt64 break; } case 4: { UInt16 USInt = S7.GetUSIntAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(USInt); break; } case 5: { UInt16 UInt = S7.GetUIntAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(UInt); break; } case 6: { UInt32 UDInt = S7.GetDWordAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(UDInt); break; } case 7: { UInt64 ULInt = S7.GetLWordAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(ULInt); break; } case 8: { int SInt = S7.GetSIntAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(SInt); break; } case 9: { int S7Int = S7.GetIntAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(S7Int); break; } case 10: { int DInt = S7.GetDIntAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(DInt); break; } case 11: { Int64 LInt = S7.GetLIntAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(LInt); break; } case 12: { Single S7Real = S7.GetRealAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(S7Real); break; } case 13: { Double S7LReal = S7.GetLRealAt(Buffer, Pos); TxtValue.Text = System.Convert.ToString(S7LReal); break; } case 14: { Int32 TimeElapsed = S7.GetDIntAt(Buffer, Pos); // TIME type is a 32 signed number of ms elapsed // Can be added to a DateTime or used as Value. TxtValue.Text = "T#" System.Convert.ToString(TimeElapsed) "MS"; break; } case 15: { Int64 TimeElapsed = S7.GetLIntAt(Buffer, Pos); // LTIME type is a 64 signed number of ns elapsed // Can be added (after a conversion) to a DateTime or used as Value. TxtValue.Text = "LT#" System.Convert.ToString(TimeElapsed) "NS"; break; } case 16: { DateTime DATE = S7.GetDateAt(Buffer, Pos); TxtValue.Text = DATE.ToString("D#yyyy-MM-dd"); break; } case 17: { DateTime TOD = S7.GetTODAt(Buffer, Pos); TxtValue.Text = TOD.ToString("TOD#HH:mm:ss.fff"); break; } case 18: { DateTime DT = S7.GetDateTimeAt(Buffer, Pos); TxtValue.Text = DT.ToString("DT#yyyy-MM-dd-HH:mm:ss.fff"); break; } case 19: { DateTime LTOD = S7.GetLTODAt(Buffer, Pos); TxtValue.Text = LTOD.ToString("LTOD#HH:mm:ss.fffffff"); break; } case 20: { DateTime DTL = S7.GetDTLAt(Buffer, Pos); TxtValue.Text = DTL.ToString("DTL#yyyy-MM-dd-HH:mm:ss.fffffff"); break; } case 21: { DateTime LDT = S7.GetLDTAt(Buffer, Pos); TxtValue.Text = LDT.ToString("LDT#yyyy-MM-dd-HH:mm:ss.fffffff"); break; } } } private void HexDump(TextBox DumpBox, byte[] bytes, int Size) { if (bytes == null) return; int bytesLength = Size; int bytesPerLine = 16; char[] HexChars = "0123456789ABCDEF".ToCharArray(); int firstHexColumn = 8 // 8 characters for the address 3; // 3 spaces int firstCharColumn = firstHexColumn bytesPerLine * 3 // - 2 digit for the hexadecimal value and 1 space (bytesPerLine - 1) / 8 // - 1 extra space every 8 characters from the 9th 2; // 2 spaces int lineLength = firstCharColumn bytesPerLine // - characters to show the ascii value Environment.NewLine.Length; // Carriage return and line feed (should normally be 2) char[] line = (new String(' ', lineLength - 2) Environment.NewLine).ToCharArray(); int expectedLines = (bytesLength bytesPerLine - 1) / bytesPerLine; StringBuilder result = new StringBuilder(expectedLines * lineLength); for (int i = 0; i < bytesLength; i = bytesPerLine) { line[0] = HexChars[(i >> 28) & 0xF]; line[1] = HexChars[(i >> 24) & 0xF]; line[2] = HexChars[(i >> 20) & 0xF]; line[3] = HexChars[(i >> 16) & 0xF]; line[4] = HexChars[(i >> 12) & 0xF]; line[5] = HexChars[(i >> 8) & 0xF]; line[6] = HexChars[(i >> 4) & 0xF]; line[7] = HexChars[(i >> 0) & 0xF]; int hexColumn = firstHexColumn; int charColumn = firstCharColumn; for (int j = 0; j < bytesPerLine; j ) { if (j > 0 && (j & 7) == 0) hexColumn ; if (i j >= bytesLength) { line[hexColumn] = ' '; line[hexColumn 1] = ' '; line[charColumn] = ' '; } else { byte b = bytes[i j]; line[hexColumn] = HexChars[(b >> 4) & 0xF]; line[hexColumn 1] = HexChars[b & 0xF]; line[charColumn] = (b < 32 ? '·' : (char)b); } hexColumn = 3; charColumn ; } result.Append(line); } DumpBox.Text=result.ToString(); } private void ReadArea() { // Declaration separated from the code for readability int DBNumber; int Amount; int SizeRead = 0; int Result; int[] Area = { S7Consts.S7AreaPE, S7Consts.S7AreaPA, S7Consts.S7AreaMK, S7Consts.S7AreaDB, S7Consts.S7AreaCT, S7Consts.S7AreaTM }; int[] WordLen = { S7Consts.S7WLBit, S7Consts.S7WLByte, S7Consts.S7WLChar, S7Consts.S7WLWord, S7Consts.S7WLInt, S7Consts.S7WLDWord, S7Consts.S7WLDInt, S7Consts.S7WLReal, S7Consts.S7WLCounter, S7Consts.S7WLTimer }; label18.Text = "0"; TxtDump.Text = ""; DBNumber = System.Convert.ToInt32(TxtDB.Text); Amount = System.Convert.ToInt32(TxtSize.Text); Result = Client.ReadArea(Area[CBArea.SelectedIndex], DBNumber, 0, Amount, WordLen[CBWLen.SelectedIndex], Buffer, ref SizeRead); StringBuilder sb = new StringBuilder(); for (int i = 0; i < Buffer.Length; i ) { sb.Append((int)Buffer[i] ","); } System.IO.File.WriteAllText(Application.StartupPath "\\error.txt", sb.ToString(), Encoding.UTF8); ShowResult(Result); //状态栏结果显示 label18.Text = SizeRead.ToString(); if (Result == 0) HexDump(TxtDump, Buffer, SizeRead); } public void DBMultiRead() { // Multi Reader Instance S7MultiVar Reader = new S7MultiVar(Client); TxtRes_A.Text = ""; TxtRes_B.Text = ""; TxtRes_C.Text = ""; int DBNumber_A = System.Convert.ToInt32(TxtDB_A.Text); int DBNumber_B = System.Convert.ToInt32(TxtDB_B.Text); int DBNumber_C = System.Convert.ToInt32(TxtDB_C.Text); // Add Items def. Reader.Add(S7Consts.S7AreaDB, S7Consts.S7WLByte, DBNumber_A, 0, 16, ref DB_A); Reader.Add(S7Consts.S7AreaDB, S7Consts.S7WLByte, DBNumber_B, 0, 16, ref DB_B); Reader.Add(S7Consts.S7AreaDB, S7Consts.S7WLByte, DBNumber_C, 0, 16, ref DB_C); // Performs the Read int Result = Reader.Read(); // Dumps the data and shows the results ShowResult(Result); TxtRes_A.Text = Client.ErrorText(Reader.Results[0]); if (Reader.Results[0] == 0) HexDump(TxtDump_A, DB_A, 16); else TxtDump_A.Text = "< No Data Available >"; TxtRes_B.Text = Client.ErrorText(Reader.Results[1]); if (Reader.Results[1] == 0) HexDump(TxtDump_B, DB_B, 16); else TxtDump_B.Text = "< No Data Available >"; TxtRes_C.Text = Client.ErrorText(Reader.Results[2]); if (Reader.Results[2] == 0) HexDump(TxtDump_C, DB_C, 16); else TxtDump_C.Text = "< No Data Available >"; } void DBMultiWrite() { for (int c = 0; c < 16; c ) { DB_A[c] = 0x01; } for (int c = 0; c < 16; c ) { DB_B[c] = 0x02; } // Multi Writer Instance S7MultiVar Writer = new S7MultiVar(Client); TxtRes_A.Text = ""; TxtRes_B.Text = ""; TxtRes_C.Text = ""; TxtDump_A.Text = ""; TxtDump_B.Text = ""; TxtDump_C.Text = ""; int DBNumber_A = Convert.ToInt32(TxtDB_A.Text); int DBNumber_B = Convert.ToInt32(TxtDB_B.Text); int DBNumber_C = Convert.ToInt32(TxtDB_C.Text); // Add Items def. Writer.Add(S7Consts.S7AreaDB, S7Consts.S7WLByte, DBNumber_A, 0, 16, ref DB_A); Writer.Add(S7Consts.S7AreaDB, S7Consts.S7WLByte, DBNumber_B, 0, 16, ref DB_B); Writer.Add(S7Consts.S7AreaDB, S7Consts.S7WLByte, DBNumber_C, 0, 16, ref DB_C); // Performs the Write int Result = Writer.Write(); // Shows the results ShowResult(Result); TxtRes_A.Text = Client.ErrorText(Writer.Results[0]); TxtRes_B.Text = Client.ErrorText(Writer.Results[1]); TxtRes_C.Text = Client.ErrorText(Writer.Results[2]); } void ReadSZL() { S7Client.S7SZL SZL = new S7Client.S7SZL(); int Size = 4096; // Declare our Buffer Size SZL.Data = new byte[Size]; label29.Text = "0"; TxtSZL.Text = ""; int Result = Client.ReadSZL(Convert.ToInt32(TxtSZLID.Text), Convert.ToInt32(TxtSZLIndex.Text), ref SZL, ref Size); ShowResult(Result); if (Result == 0) { label29.Text = Size.ToString(); HexDump(TxtSZL, SZL.Data, Size); } } private void PlcDBWrite() { // Declaration separated from the code for readability int DBNumber; int Size; int Result; DBNumber = System.Convert.ToInt32(TxtDB.Text); Size = System.Convert.ToInt32(TxtSize.Text); Result = Client.DBWrite(DBNumber, 0, Size, Buffer); ShowResult(Result); } void ReadCPUInfo() { S7Client.S7CpuInfo Info = new S7Client.S7CpuInfo(); txtModuleTypeName.Text = ""; txtSerialNumber.Text = ""; txtCopyright.Text = ""; txtAsName.Text = ""; txtModuleName.Text = ""; int Result = Client.GetCpuInfo(ref Info); ShowResult(Result); if (Result==0) { txtModuleTypeName.Text = Info.ModuleTypeName; txtSerialNumber.Text = Info.SerialNumber; txtCopyright.Text = Info.Copyright; txtAsName.Text = Info.ASName; txtModuleName.Text = Info.ModuleName; } } void ReadOrderCode() { S7Client.S7OrderCode Info = new S7Client.S7OrderCode(); txtOrderCode.Text = ""; txtVersion.Text = ""; int Result = Client.GetOrderCode(ref Info); ShowResult(Result); if (Result == 0) { txtOrderCode.Text = Info.Code; txtVersion.Text = Info.V1.ToString() "." Info.V2.ToString() "." Info.V3.ToString(); } } private void button1_Click(object sender, EventArgs e) { // These are tests done on my DB DateTime DT = DateTime.Now; S7.SetSIntAt(Buffer, 40, -125); S7.SetIntAt(Buffer, 42, 32501); S7.SetDIntAt(Buffer, 44, -332501); S7.SetLIntAt(Buffer, 48, -99832501); S7.SetRealAt(Buffer, 56, (float)98.778); S7.SetLRealAt(Buffer, 60, 123000000000.778); S7.SetUSIntAt(Buffer, 24, 125); S7.SetUIntAt(Buffer, 26, 32501); S7.SetUDIntAt(Buffer, 28, 332501); S7.SetULintAt(Buffer, 32, 99832501); S7.SetDateAt(Buffer, 80, DT); S7.SetTODAt(Buffer, 82, DT); S7.SetDTLAt(Buffer, 112, DT); S7.SetLTODAt(Buffer, 86, DT); S7.SetLDTAt(Buffer, 94, DT); PlcDBWrite(); } private void btnMultiRead_Click(object sender, EventArgs e) //MultiRead { DBMultiRead(); } private void btnMultiWrite_Click(object sender, EventArgs e) //MultiWrite { DBMultiWrite(); } private void ReadSZLBtn_Click(object sender, EventArgs e) { ReadSZL(); } private void ReadCPUInfoBtn_Click(object sender, EventArgs e) { ReadCPUInfo(); } private void ReadOrderCodeBtn_Click(object sender, EventArgs e) { ReadOrderCode(); } private void button3_Click(object sender, EventArgs e) //读取PLC日期时间 { DateTime DT = new DateTime(); if (Client.GetPlcDateTime(ref DT) == 0) { txtDateTime.Text = DT.ToLongDateString() " - " DT.ToLongTimeString(); } } private void SetDateTimeBtn_Click(object sender, EventArgs e) //将当期系统时间写入PLC { ShowResult(Client.SetPlcSystemDateTime()); //状态栏结果显示 } private void SetPwdBtn_Click(object sender, EventArgs e) { ShowResult(Client.SetSessionPassword(txtPwd.Text)); //状态栏结果显示 } private void ClrPwdBtn_Click(object sender, EventArgs e) { ShowResult(Client.ClearSessionPassword()); //状态栏结果显示 } void ShowPlcStatus() { int Status = 0; int Result = Client.PlcGetStatus(ref Status); ShowResult(Result); //状态栏结果显示 if (Result == 0) { switch (Status) { case S7Consts.S7CpuStatusRun: { lblStatus.Text = "RUN"; lblStatus.ForeColor = System.Drawing.Color.LimeGreen; break; } case S7Consts.S7CpuStatusStop: { lblStatus.Text = "STOP"; lblStatus.ForeColor = System.Drawing.Color.Red; break; } default: { lblStatus.Text = "Unknown"; lblStatus.ForeColor = System.Drawing.Color.Black; break; } } } else { lblStatus.Text = "Unknown"; lblStatus.ForeColor = System.Drawing.Color.Black; } } string HexByte(byte B) { string Result = Convert.ToString(B, 16); if (Result.Length < 2) Result = "0" Result; return "0x" Result; } string HexWord(ushort W) { string Result = Convert.ToString(W, 16); while(Result.Length<4) Result = "0" Result; return "0x" Result; } void GetBlockInfo() { S7Client.S7BlockInfo BI = new S7Client.S7BlockInfo(); int[] BlockType = { S7Client.Block_OB, S7Client.Block_DB, S7Client.Block_SDB, S7Client.Block_FC, S7Client.Block_SFC, S7Client.Block_FB, S7Client.Block_SFB }; txtBI.Text = ""; int Result = Client.GetAgBlockInfo(BlockType[CBBlock.SelectedIndex], System.Convert.ToInt32(txtBlockNum.Text), ref BI); ShowResult(Result); //状态栏结果显示 if (Result==0) { // Here a more descriptive Block Type, Block lang and so on, are needed, // but I'm too lazy, do it yourself. txtBI.Text = txtBI.Text "Block Type : " HexByte((byte)BI.BlkType) (char)13 (char)10; txtBI.Text = txtBI.Text "Block Number : " Convert.ToString(BI.BlkNumber) (char)13 (char)10; txtBI.Text = txtBI.Text "Block Lang : " HexByte((byte)BI.BlkLang) (char)13 (char)10; txtBI.Text = txtBI.Text "Block Flags : " HexByte((byte)BI.BlkFlags) (char)13 (char)10; txtBI.Text = txtBI.Text "MC7 Size : " Convert.ToString(BI.MC7Size) (char)13 (char)10; txtBI.Text = txtBI.Text "Load Size : " Convert.ToString(BI.LoadSize) (char)13 (char)10; txtBI.Text = txtBI.Text "Local Data : " Convert.ToString(BI.LocalData) (char)13 (char)10; txtBI.Text = txtBI.Text "SBB Length : " Convert.ToString(BI.SBBLength) (char)13 (char)10; txtBI.Text = txtBI.Text "Checksum : " HexWord((ushort)BI.CheckSum) (char)13 (char)10; txtBI.Text = txtBI.Text "Version : 0." Convert.ToString(BI.Version) (char)13 (char)10; txtBI.Text = txtBI.Text "Code Date : " BI.CodeDate (char)13 (char)10; txtBI.Text = txtBI.Text "Intf.Date : " BI.IntfDate (char)13 (char)10; txtBI.Text = txtBI.Text "Author : " BI.Author (char)13 (char)10; txtBI.Text = txtBI.Text "Family : " BI.Family (char)13 (char)10; txtBI.Text = txtBI.Text "Header : " BI.Header; } } void GetSelectedDB() { int Size = 65536; // 64 K (the maximum for a S7400) byte[] Buffer = new byte[Size]; txtDBGet.Text = ""; int Result = Client.DBGet(System.Convert.ToInt32(txtBlockNum.Text), Buffer, ref Size); ShowResult(Result); //状态栏结果显示 if (Result==0) { HexDump(txtDBGet, Buffer, Size); } } private void PlcStatusBtn_Click(object sender, EventArgs e) { ShowPlcStatus(); } private void PlcStopBtn_Click(object sender, EventArgs e) { ShowResult(Client.PlcStop()); //状态栏结果显示 ShowPlcStatus(); } private void PlcHotBtn_Click(object sender, EventArgs e) { ShowResult(Client.PlcHotStart()); //状态栏结果显示 ShowPlcStatus(); } private void PlcColdBtn_Click(object sender, EventArgs e) { ShowResult(Client.PlcColdStart()); //状态栏结果显示 ShowPlcStatus(); } private void BlockInfoBtn_Click(object sender, EventArgs e) { GetBlockInfo(); } private void DBGetBtn_Click(object sender, EventArgs e) { GetSelectedDB(); } } }
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论