PPI通讯
是西门子公司专为s7-200系列plc开发的通讯协议。内置于s7-200 CPU中。PPI协议物理上基于RS-485口,通过屏蔽双绞线就可以实现PPI通讯。PPI协议是一种主-从协议。主站设备发送要求到从站设备,从站设备响应,从站不能主动发出信息。主站靠PPI协议管理的共享毗连来与从站通讯。PPI协议并不限定与任意一个从站的通讯的主站的数量,但在一个网络中,主站不能凌驾32个。PPI协议最根本的用途是让西门子Step7-Micro/Win编程软件上传和下载程序和西门子人机界面与PC通讯。
MPI通讯
- MPI (multipoint interface)是SIMATIC s7多点通讯的接口,是一种适用于少数站点间通讯的网络,多用于毗连上位机和少量plc之间近距离通讯。通过Profibus电缆和接头,将控制器s7-300或s7-400的CPU自带的MPI编程口及s7-200CPU 自带的PPI通讯口相互毗连,以及与上位机网卡的编程口(MPI/DP 口)通过Profibus或MPI电缆毗连即可实现。 网络中固然也可以不包括PC机而只包括plc。
- MPI的通讯速率为19.2k~12mbit/s ,但直接毗连s7-200CPU通讯口的MPI网,其最高速率通常为187.5kbit/s (受s7-200CPU最高通讯速率的限定)。在MPI网络上最多可以有32个站,一个网段的最长通讯距离为50米(通讯波特率为187.5kbit/s时),更长的通讯距离可以通过rs-485中继器扩展。MPI允许主-主通讯和主-从通讯,每个s7-200CPU通讯口的毗连数为4个。
- MPI协议不能与一个作为PPI主站的s7-200CPU通讯,即s7-300或s7-400与s7-200通讯时必须保证这个s7-200 CPU不能再作PPI主站,Micro/Win也不能通过MPI协议访问作为PPI主站的s7-200CPU。s7-200CPU只能做MPI从站,即s7-200CPU之间不能通过MPI网络相互通讯,只能通过PPI方式相互通讯
Modbus通讯
- Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。为更好地遍及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给IDA(Interface for Distributed Automation,分布式主动化接口)组织,并成立了Modbus-IDA组织,为Modbus以后的发展奠定了基础。在我国,Modbus已经成为国家尺度GB/T19582-2008。据不完全统计:截止到2007年,Modbus的节点安装数量已经凌驾了1000万个。
- Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(比方以太网)和其它设备之间可以通讯。它已经成为一通用工业尺度。有了它,不同厂商生产的控制设备可以连成工业网络,举行会合监控。此协议定义了一个控制器能熟悉利用的消息结构,而不管它们是经过何种网络举行通讯的。它描述了一控制器哀求访问其它设备的过程,如何回应来自其它设备的哀求,以及怎样侦测错误并记载。它订定了消息域格局和内容的公共格式。Modbus是一种单主站的主/从通讯模式。一条Modbus网络上同时只能有一台主站,从站可以有若干个
Modbus特点:
1、尺度、开放,用户可以免费、放心地利用Modbus协议,不需要交纳允许证费,也不会侵犯知识产权。目前,支持Modbus的厂家凌驾400家,支持Modbus的产品凌驾600种。
2、Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
3、Modbus的帧格式简朴、紧凑,普通易懂。用户利用轻易,厂商开发简朴。
注:S7-200只支持Modbus RTU协议,不支持Modbus ASCII协议
using S7.Net
- Plc plc;
- Thread t1;
-
- //连接相机
- CogAcqFifoTool fifoTool=null;
- //tb
- CogToolBlock tb=null;
- private void ConnectPlc()
- {
- try
- {
- //CPUType.S71200 型号 S7-200、 S7-1200、S7-300、S7-400/S7-1500
- //"192.168.122.2" ip地址 plc提供
- //rack: 机台号的位置,这个点也是PLC的知识点
- //slot: 插槽号的位置,也是PLC的知识点
- plc = new Plc(CpuType.S71200, "127.0.0.1", 102, 0, 0);
- plc.Open();
- //实时读取plc发过来的信息
- t1 = new Thread(Read);
- t1.Start();
- }catch (Exception ex)
- {
- MessageBox.Show("plc连接失败");
- }
- }
- private void Read()
- {
- while (true)
- {
- //读取里面存储的数据
- int res = Convert.ToInt32(plc.Read("MD104"));
- //为了允许跨线程
- Invoke(new Action(() =>
- {
- if (res == 1)
- {
- TakePlc();
- }
- else
- {
- }
- }));
- }
- }
- private void TakePlc()
- {
- //判断相机是否连接正常
- if(fifoTool.Operator!=null)
- {
- fifoTool.Run();
- ICogImage image=fifoTool.OutputImage;
- cogDisplay1.Image = image;
- cogDisplay1.Fit();
- tb.Inputs["OutputImage"].Value = image;
- tb.Run();
- cogRecordDisplay1.Record = tb.CreateCurrentRecord().SubRecords[1];
- cogRecordDisplay1.Fit();
- double with = (double)tb.Outputs["width"].Value;
- if(with>368)
- {
- plc.Write();
- }
- else
- {
- plc.Write();
- }
- }
-
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- ConnectPlc();
- tb = (CogToolBlock)CogSerializer.LoadObjectFromFile(Directory.GetCurrentDirectory() + "\\tb.vpp");
- }
复制代码 创建类SiemensPLC
CpuType: PLC的cpu型号
IP: PLC的IP位置
rack: 机台号的位置
slot: 插槽号的位置
- public class SiemensPLC
- {
- // CpuType: PLC的cpu型号。我这里是1200/1212C。
- // IP: PLC的IP地址。
- // rack: 机台号的位置,这个也是PLC的知识点。
- // slot: 插槽号的位置,也是PLC的知识点
- public Plc plc = null;
- CpuType plcType;
- string ip;
- short rack;
- short slot;
- public SiemensPLC(CpuType type, string ip, short rack, short slot)
- {
- this.plcType = type;
- this.ip = ip;
- this.rack = rack;
- this.slot = slot;
- try
- {
- plc = new Plc(plcType, ip, rack, slot);
- }
- catch (Exception ex)
- {
- Console.WriteLine(ex.Message);
- }
- }
- public string ConnectionPLC()
- {
- string res = string.Empty;
- try
- {
- plc.Open();//连接plc
- res = "Connection is OK";
- }
- catch (Exception ex)
- {
- res = $"Connection is Fail{ex.Message}";
- }
- return res;
- }
- ///<summary>
- ///判断PLC是否已连接
- /// </summary>
- public bool PLCISOK()
- {
- return plc != null && plc.IsConnected;
- }
-
- ///<summary>
- ///向PLC写入数据
- /// </summary>
- /// <param name="add">地址</param>
- /// <param name="value">数据</param>
- public void Write(string add, object value)
- {
- plc.Write(add, value);
- }
- /// <summary>
- /// 读取某个地址的内容
- /// </summary>
- /// <param name="add">地址</param>
- /// <returns></returns>
- public object Read(string add)
- {
- return plc.Read(add);
- }
- public void DisconnectionPLC()
- {
- plc.Close();
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |