C# 松下PLC通讯协议标准类代码.doc_第1页
C# 松下PLC通讯协议标准类代码.doc_第2页
C# 松下PLC通讯协议标准类代码.doc_第3页
C# 松下PLC通讯协议标准类代码.doc_第4页
C# 松下PLC通讯协议标准类代码.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.IO.Ports;using System.Windows.Forms;namespace WindowsFormsApplication1 class PLC / / 速美达自动化 郑茂强 / / /触点 X、Y、R /数据寄存器 D /*-读取单触点状态RCS (XYR)- * 例:读取Y1 * 发送:%01#RCSY0001*CR * 返回:%01$RC1*CR * 0=off,1=on * -*/ /*-写入单触点状态WCS (XYR)- * 例:写入Y1=on * 发送:%01#WCSY00011*CR * 返回:%01$WC*CR * -*/ /*-读取多触点状态RCP (XYR)- * 例:读取Y1-Y3 * 发送:%01#RCP3Y0001R0001Y0003T0099*CR * 返回:%01$RC1011*CR * 0=off,1=on * -*/ /*-读取Word型触点状态RCC (XYR)- * 例:读取Y1-Y3 * 发送:%01#RCCY00010003*CR * 返回:%01$RC34127856BC9A*CR * -*/ /*-写入多触点状态WCP (XYR)- * 例:写入Y1-Y3为on * 发送:%01#WCP3Y00011R00021Y00031*CR * 返回:%01$WC*CR * 0=off,1=on * -*/ /*-读取DT数据RD- *例:读取D1105-D1107的内容 *发送:%01#RDD011050110757CR *返回:%01$RD630044330A0062CR *值:D1105=0063H,D1106=3344H,D1107=000AH *-*/ /*-写入DT数据WD- * 例:写入数据到D1-D13 D1=0005H,D2=1507H,D=0900H * 发送:%01%WDD00001000030500071500095DCR * 返回:%01$WD13CR *-*/ public static TextBox txtCommLog = new TextBox(); public static SerialPort COMM = new SerialPort(); public static double DTValue = null; public static System.Collections.BitArray arrXYMValue = null; public static int iDelay = 60; public static bool Open(string strPort) try if (COMM.IsOpen) COMM.Close(); COMM.PortName = strPort; COMM.BaudRate = 19200; COMM.Parity = Parity.Even; COMM.DataBits = 7; COMM.StopBits = StopBits.One; COMM.NewLine = rn; COMM.DataReceived += new SerialDataReceivedEventHandler(OnDataReceived); COMM.Open(); return true; catch (Exception ex) return false; public static void Close() if (COMM.IsOpen) COMM.Close(); private delegate void SetTextCallback(string text); private static void SetText(string text) /记录通信事件 if (txtCommLog.InvokeRequired) SetTextCallback d = new SetTextCallback(SetText); txtCommLog.Invoke(d, new object text ); else txtCommLog.Text = text + rn + txtCommLog.Text; private static void OnDataReceived(object sender, SerialDataReceivedEventArgs e) int i = 0; string readText = ; Thread.Sleep(1); readText = COMM.ReadLine(); string sHead = readText.Substring(0, 4);/%01$; string sComm = readText.Substring(4, 2);/RC/WC/RD/WD string sValues = ; string tValue =; byte tXYMValue = null; Int32 iValue = 0; SetText(PLC-PC: + readText); switch (sHead) case %01$: /读写成功 switch (sComm) case RD:/读取WD,转换为十进制 sValues = readText.Substring(6, readText.Length - 8); DTValue = new doublesValues.Length / 4; for (i = 0; i (sValues.Length / 4); i+) tValue = sValues.Substring(i * 4, 4); DTValuei = (double)Convert.ToInt32(tValue.Substring(2, 2) + tValue.Substring(0, 2), 16) / 100; Console.WriteLine(DT+i.ToString()+:+DTValuei.ToString(); break; case RC: /RCC读取Word类型触点,转换为二进制 sValues = readText.Substring(6, readText.Length - 8); /XYMValue = new Int32sValues.Length / 4; arrXYMValue = new System.Collections.BitArraysValues.Length / 4; for (i = 0; i (sValues.Length / 4); i+) tValue = sValues.Substring(i * 4, 4); iValue = Convert.ToInt32(tValue.Substring(2, 2) + tValue.Substring(0, 2), 16); tXYMValue = BitConverter.GetBytes(iValue); arrXYMValuei = new System.Collections.BitArray(tXYMValue); Console.WriteLine(XYM + i.ToString() + : + arrXYMValueii.ToString(); /- /arrXYMValue0n 第1个Mn的值 如:M8,则arrXYMValue08 /arrXYMValue1n 第2个Mn的值 /- break; case WD: /写入DT成功,没返回值! break; case WC: /写入触点成功,没返回值! break; break; case %01!: /读写失败 /返回错误 break; / / 设置单触点 / setM(string XYMaddr,int value) / XYMaddr:寄存器地址 / value=0 off; / value=1 on; / public static void setM(string XYMaddr,int value) /value 0=off,1=on /发送:%01#WCSY00011*CR string outStr = ; string sReg=XYMaddr.Substring(0,1); string sAddr=XYMaddr.Substring(1,XYMaddr.Length-1).PadLeft(4).Replace( ,0); outStr = %01#WCS + sReg + sAddr + value.ToString(); outStr = outStr + bcc(outStr)+r; COMM.Write(outStr); SetText(PC-PLC: + outStr); return; / / 本命令只是发送,取值,取值在OnDataReceived里 /按字读取触点 / readMS(string DTaddr1, string DTaddr2) / DTaddr1:寄存器起始地址 / DTaddr2:寄存器结束地址 / 如:readMS(M1,M4); / %01#RCCR00090009 读WR9到WR9 / / / public static void readMS(string DTaddr1, string DTaddr2) /-地址转换- string sReg = DTaddr1.Substring(0, 1); /获取D string sA1 = DTaddr1.Substring(1, DTaddr1.Length - 1); /DT1中的1 string sA2 = DTaddr2.Substring(1, DTaddr2.Length - 1); /DT4中的4 int iLen = Convert.ToInt16(sA2) - Convert.ToInt16(sA1) + 1; /4-1 /-按字读触点地址要除于10? sA1 = sA1.PadLeft(4).Replace( , 0); sA2 = sA2.PadLeft(4).Replace( , 0); string sAddr = sReg + sA1 + sA2; /地址:D0000100004 /- string outStr = ; outStr = %01#RCC + sAddr; outStr = outStr + bcc(outStr) + r; COMM.Write(outStr); SetText(PC-PLC: + outStr); return; / / writeDT(string DTaddr1,string DTaddr2, int value) / DTaddr1:寄存器起始地址 / DTaddr2:寄存器结束地址 / value=数值; / 如:writeDT(D1,D4,arrValue); 其中double arrValue=0.1,23.3,22.0,43.55; / public static void writeDT(string DTaddr1,string DTaddr2, double value) /发送:%01%WDD00001000030500071500095DCR /-地址转换- string sReg = DTaddr1.Substring(0, 1); /获取D string sA1 = DTaddr1.Substring(1, DTaddr1.Length - 1); /DT1中的1 string sA2 = DTaddr2.Substring(1, DTaddr2.Length - 1); /DT4中的4 int iLen = Convert.ToInt16(sA2) - Convert.ToInt16(sA1) + 1; /4-1 sA1 = sA1.PadLeft(5).Replace( , 0); sA2 = sA2.PadLeft(5).Replace( , 0); string sAddr = sReg + sA1 + sA2; /地址:D0000100004 /-数值转换- string sValues = ; string sValue = ; for (int i = 0; i PLC: + outStr); return; / / 本命令只是发送,取值,取值在OnDataReceived里 / readDT(string DTaddr1, string DTaddr2) / DTaddr1:寄存器起始地址 / DTaddr2:寄存器结束地址 / 如:readDT(D1,D4); / / / public static void readDT(string DTaddr1, string DTaddr2) /-地址转换- string sReg = DTaddr1.Substring(0, 1); /获取D string sA1 = DTaddr1.Substring(1, DTaddr1.Length - 1); /DT1中的1 string sA2 = DTaddr2.Substring(1, DTaddr2.Length - 1); /DT4中的4 int iLen = Convert.ToInt16(sA2) - Convert.ToInt16(sA1) + 1; /4-1 sA1 = sA1.PadLeft(5).Replace( , 0); sA2 = sA2.PadLeft(5).Replace( , 0); string sAddr = sReg + sA1 + sA2; /地址:D0000100004 /- string outStr = ; outStr = %

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论