做工业软件的人,西门子PLC是绕不开的,S7-1200、1500、300在长三角工厂里到处都是,C#对接是基本功,上位机开发很多人第一次接西门子,照着网上的Demo写,能读能写就觉得搞定了,一上现场各种问题,断线、卡顿、数据错,PLC上位机本文把C#对接西门子PLC的实战经验理一理,从协议到库,从读写到稳定性,该踩的坑提前说清楚,这一步省不得时间,上位机软件公司西门子PLC通讯走S7协议,这是西门子私有协议,基于ISO-on-TCP,端口102,握手后才能收发数据,上位机开发S7协议的报文结构不复杂,但自己写太麻烦,开源库Snap7已经把协议封装好了,C#直接调用就行,这都是基本功,PLC上位机Snap7是德国人写的,C++核心,C#有封装好的S7.NetPlus,NuGet直接装,不用自己编译C++,
上位机软件公司的S7协议原理
用Snap7第一步是连接,S7-1200/1500直接连IP,S7-300要设Rack和Slot,0和2,上位机开发连接要判断返回值,0是成功,非0是错误码,别只看Connect不看结果,连不上后面全是空读,老老实实做不返工,PLC上位机读数据用DBRead,参数是DB号、起始地址、长度,返回字节数组,自己按类型解析,切记,把小事做扎实比啥都强,上位机软件公司写数据用DBWrite,同样是DB号、起始地址、字节数组,写之前要确认PLC没有写保护,每个环节都有它的道理,上位机开发位操作是第一个坑,S7协议按字节读,要读某个位就得先读整个字节再移位,别一位一位读,太慢,该花的功夫省不下来,
PLC上位机的Snap7读写
批量读比单个读快得多,把同一DB块连续地址合并成一次读,性能差几倍,点位多的时候差距明显,上位机软件公司字节序是第二个坑,西门子是大端,C#的BitConverter默认小端,直接转会得到完全错误的数值,上位机开发读16位整数要反转字节,32位浮点数要反转两个字再转,这个坑几乎每个新人都踩过,真到现场你就明白这些话的分量,PLC上位机断线重连是生产环境必备,PLC断电、网线松动、交换机故障都会断连,程序不能因为断线就崩,管理出效益细节见真章,上位机软件公司重连逻辑要做退避,断线后立即连一次,连不上等几秒再连,别死循环连,把PLC和网络都拖垮,别急,这些细节别落下,
上位机开发的断线重连
心跳机制不能少,定时发一个读请求,成功就重置计时器,超时就触发重连,别等下次业务读才发现断了,PLC上位机长连接比短连接好,每次读写都建连断连开销大,PLC也受不了频繁建连,保持连接按需读写,别嫌烦,出了问题不好查,上位机软件公司多线程并发要注意,Snap7的连接不是线程安全的,多个线程同时读写会乱,要么加锁要么每个线程独立连接,上位机开发加锁简单但会排队,独立连接灵活但占资源,点位不多用锁,点位多用连接池,现场都用得上,别抱侥幸心理觉得不会遇到,PLC上位机类型转换要封装成工具类,Bool、Int16、Int32、Float、String都处理,别写BitConverter,
上位机软件公司的类型转换坑
字符串要注意西门子的编码,默认是ASCII,中文字符要转GB2312,长度也要对,多一位少一位都乱码,上位机开发日期时间在西门子里是特殊类型,DT格式7字节,BCD编码,解析起来麻烦,建议用库自带的方法,别等出事才想起来,PLC上位机错误处理要细,读失败分连接失败、地址错误、长度错误,不同错误处理方式不同,别一律catch吞掉,老工程师都懂,上位机软件公司日志要记清楚,连接、断线、重连、读写错误都记,出问题翻日志比猜强,工业项目日志是排障生命线,前期偷懒后期还债,上位机开发配置别写死,IP、Rack、Slot、DB号、地址都放配置文件,换PLC改配置不用重新编译,这都是踩坑换来的,
PLC上位机的稳定性优化
数据点表很重要,地址、类型、含义、单位、缩放系数都列清楚,开发和现场对表用,别靠脑子记,上位机软件公司测试要做边界,空值、满值、负数、异常值都测,现场数据什么样都有,不测边界迟早出问题,慢慢来,好记性不如烂笔头,上位机开发压力测试要跑,连续读写几小时看内存和CPU,内存泄漏、句柄泄漏都是跑久了才暴露,按顺序来就行,做项目就是这样,PLC上位机赢式科技在西门子通讯方面做过很多项目,S7-1200到400都接过,断线重连和批量读写这些坑都踩过,上位机软件公司需要西门子产线电脑端系统通讯方案,可以联系赢式科技电话15001875806,从协议到底层通讯都有成熟方案。
