[西门子] C#读取西门子S7系列PLC

[复制链接]
查看116 | 回复0 | 2024-4-16 16:46:03 | 显示全部楼层 |阅读模式
需求

现在有一个生产系统,使用的是PLC+组态软件的监控模式(软硬件都是别的厂家提供的),我们作为第三方想接入这套系统的数据。具体结构如下图。

(以下我们这边的数据采集服务器简称 “服务器” )
服务器上有一套类似于kepServer的数采软件,集成了很多设备驱动和协议。
根据这套系统的网络情况和上位机软件类别,大概可以分这几种情况:
1、服务器和PLC能通,直接采集;
2、服务器和PLC不通,但是和上位机通,通过上位机的OPC采集数据(很多上位机自带OPC功能);
3、服务器和PLC不通,但是和上位机通,但是上位机没有OPC功能


第一个最方便,跟原厂家要一下设备型号、IP、点表,用数采软件采集即可;
第二个也还好,配置一下opc dcom,或者在本地把opc转成modbus、opcua或其他协议后再跨网络采集;

  • opc转modbus,可以参考之前写的系列文章,有介绍
  • 这里面很多厂家在用pojie版的数采软件在本地采集后再转发出去,省去开发成本,一般情况下也比较稳定
  • 缺点就是得在现场装一个pojie版软件,有时候装着装着容易对原监控系统造成影响
  • 部分xp系统装不了或者装上之后无法转发
第三个跟第二个类似,在现场装一个pojie软件直采PLC然后再转发,或者自己开发个小软件转发。


今天我们主要说一下,自己用C#开发个采集西门子PLC的小软件。


思路

开发个简单的winform程序,考虑到工业现场还有很多xp系统,就基于netFrameWork4.0框架来做。
选来选去,最后决定使用Sharp7这个库,开源免费,且支持上述框架(也就是说支持xp平台)。
其他类似的库还有s7.netplus、hslcommunication通讯库等,功能都能强大,读者也都可以考虑。



最终做出来后界面类似下图



主要的功能有:

  • 添加删除设备,配置设备信息
  • 导入csv格式的变量文件
  • 保存当前的设备配置信息
  • 测试/启动/停止通讯
  • 设备实时数据监视
  • 软件启动后自动启动通讯、运行期间断线重连


简要代码

Sharp7 Reference manual (sourceforge.net)
首先这是sharp7使用参考手册,知乎和CSDN上也有很多使用介绍和案例,多多参考。


界面方面的就不多说了,主要是功能:
1、构建一个点位信息类CSVTag,在界面上右键 “导入CSV ”时候把所有点位信息存入List中。
每个设备的通讯信息也要存起来,方便后面连接PLC和读取数据。


2、构建一个S7Helper,里面是几个通讯和读取数据的方法,和一些属性






3、主程序中为每个设备开启一个读取数据的线程

4、在读取线程中,针对变量的每种地址格式分开统计然后读取
I、Q、V、M、DB



针对DB块,还要把不同的DB块区分开读取。



5、读取完成后,分配给原变量




大概代码就上面那么多。
目前的缺点是:
1、对于每个地址区,比如M区,假如只有两个变量,M1,M500,依旧会去读500多个byte,并没有智能的拆散拼凑成较连续的地址再分开读,不知道会不会节省点时间。


采集到数据后,后续的目的是转发出去。

  • 比如就在本地转成modbus,让别人连,读取数据,甚至反控
  • 比如自己开发个通讯协议,通过socket方式传出去,对面收到后再解析,对面的电脑上再转成opcua,mqtt,或者存数据库,whatever


opcua server的话可以用python的freeopcua,或者c#里的opc基金会的库,但是需要商业授权;
mqtt的话可以用c#的mqttnet库,教程很多。
本次就先到这里吧,后续再更。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则