命名空间:PLCLibrary.SiemensProtocol
功能:西门子PLC通讯类
功能详细说明:
这个类经测试可以支持S7 300, S7 1200, S7 1500等西门子PLC,勇哥已经经过实际项目的检验,高度可靠,大家可以放心使用。
常用函数列表:
public string BrandPLCModel { get; } public bool ConnStatus { get; } public bool DataChangeBusy { get; } public int EndCode { get; } public Dictionary<string, byte> Memory { get; } public int Port { get; } public bool PortChangeAvailable { get; } public string SequenceINT16 { get; } public string SequenceINT32 { get; } public bool CpuModel(out string cpuModel); //关闭连接plc public void TcpClose(); //连接plc public bool TcpConnect(string plcIPAddress, int plcPort = 102); //读plc内存,范型 public bool TcpRead<T>(byte eMemory, int offset, int readLength, out List<T> readData, int bOffset = 0, int dbNo = 0); //写plc内存,范型 public bool TcpWrite<T>(byte eMemory, int offset, int writeLength, List<T> writeData, int bOffset = 0, int dbNo = 0);
参考例子:
这个例子是从一个项目中截取的,演示了连接plc, 读写plc的基本方法。
int mareaBeginAddr = 0; bool isReadMArea = false; List<short> data = new List<short>(); List<float> Mdata = new List<float>(); float[] dataWrite = new float[16]; var simens = new PLCLibrary.SiemensProtocol(0); IPAddress ipAddress; IPAddress.TryParse(Program.setting.ServerIPAddress, out ipAddress); //"192.168.22.10" if (simens.TcpConnect(Program.setting.ServerIPAddress)) { conn = true; swHeart.Restart(); } else { OutErrInfo("plc连接失败!检查原因后需要重启程序!"); return; } int beginAddr = int.Parse(addr[0]), offset = int.Parse(addr[1]); //offset = 0; beginAddr = 15; mareaBeginAddr = offset / 4; if (isReadMArea) flag2 = simens.TcpRead((byte)PLCLibrary.eSiemensMemory.M, mareaBeginAddr, 14, out Mdata); else flag2 = simens.TcpRead((byte)PLCLibrary.eSiemensMemory.DB, 0, 28, out data, offset, beginAddr); if (!flag2) { throw new ArgumentNullException("read plc error!"); } if (isReadMArea) { if (!simens.TcpWrite((byte)PLCLibrary.eSiemensMemory.M, mareaBeginAddr, 16, dataWrite.ToList())) sb2.Append("写plc err!"); } else { //write db List<float> data1 = new List<float>(); if (!simens.TcpWrite((byte)PLCLibrary.eSiemensMemory.DB,16 * 4, 15, dataWrite.ToList(), 0, int.Parse(addr[0]))) sb2.Append("写plc err!"); }
下面是勇哥在一个项目中定义的和PLC通讯的地址表。
其中第二项为0的是读取的地址,为1的是写入的地址, Single在plc那边表示32位浮点数。
204是一个db块,注意这个db块要求plc在定义时编号最好不要超过800(具体多少勇哥记不清,但是有限制)。
另外,plc那边需要做一些设置,比如要开放远程读写权限,否则可能只能连接上plc,但是无法读写。
这方面请看勇哥的另一篇经验贴子:
204.0|0|Single|当前速度(m/min) 204.4|0|Single|轧压机状态(停止/运行) 204.8|0|Single|传动侧压力 204.12|0|Single|操作侧压力 204.16|0|Single|传动侧上预弯力 204.20|0|Single|操作上预弯力 204.24|0|Single|传动侧下预弯力 204.28|0|Single|操作下预弯力 204.32|0|Single|收卷张力1 204.36|0|Single|收卷张力2 204.40|0|Single|收卷除皱张力 204.44|0|Single|放卷张力 204.48|0|Single|入牵除皱张力 204.52|0|Single|split张力 204.64|1|Single|极片标准值 204.68|1|Single|传动侧厚度 204.72|1|Single|操作侧厚度 204.76|1|Single|上限 204.80|1|Single|下限 204.84|1|Single|心跳包 204.88|1|Single|运行状态 204.92|1|Single|MES断网 204.96|1|Single|辊压机停机 204.100|1|Single|未使用 204.104|1|Single|未使用 204.108|1|Single|扫描完成标志 204.112|1|Single|未使用 204.116|1|Single|未使用 204.120|1|Single|未使用
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

