直接用TCPIP方式读取PLC数据应该怎么做

直接用TCPIP方式读取PLC数据应该怎么做,第1张

一般plc都是串口,那么需要一个串口转网口的转换器atc-2000转换成网络信号。然后,连接到电脑上,可以直接通信。您的电脑还需要软件,接受plc采集到的数据信息,那么就可以直接读取到您的电脑上面。

1:S7-300集成的PN口,是支持TCP/IP协议的!至于怎么读取,你上位机 按照TCP 协议的编程方式来进行读取数据就行,PLC里也有相关的功能块原来发送和接受数据。需要注意的是,那方系统作为服务器和客户机的问题:

2:集成的PN口支持 Modbus TCP,但是使用方式和用到的功能块和CP有些区别。原理是一样的

基于 S7-300,400 CPU 集成 PN 接口 Modbus TCP 通讯快速入门 参考如下

https://support.industry.siemens.com/cs/document/90276758/%E5%9F%BA%E4%BA%8E-s7-300400-cpu-%E9%9B%86%E6%88%90-pn-%E6%8E%A5%E5%8F%A3-modbus-tcp-%E9%80%9A%E8%AE%AF%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8?dti=0&lc=zh-CN

基于 S7-300,400 以太网通讯模块 CP343-1&CP443-1 Modbus TCP 通讯快速入门 参考如下

https://support.industry.siemens.com/cs/document/90276761/%E5%9F%BA%E4%BA%8E-s7-300400-%E4%BB%A5%E5%A4%AA%E7%BD%91%E9%80%9A%E8%AE%AF%E6%A8%A1%E5%9D%97-cp343-1cp443-1-modbus-tcp-%E9%80%9A%E8%AE%AF%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8?dti=0&lc=zh-CN

补充:

1:见上面的连接,PN口的TCP连接是需要在PLC 中调用功能块建立连接的,不需要组态。但是双方都要编程的!

2:都用高级语言自己开发上位机了,那么,你只要看下TCPIP协议,我想你应该为Socket编程吧!按照协议标准进行发送和接受数据就行。至于要度上面数据,自己和PLC 厂家定义个就行。

既然你需要走TCP协议,为什么不直接使用MODBUS TCP 这个公开的协议了,S7-300 PN口支持这个协议。

正好我前段时间做过三菱Modbus协议电表监控开发。我只是通过自己的摸索,用C#来做监控。因为我不是专门做硬件开发的,所以可能给你的回答不是很准确,硬件监控是实时的,通过TCP、UDP什么的我还真不知道有没有这一说,我这个电表的协议是Modbus。

读写电表需要发送读写的命令,一般是  “地址 命令 个数 验证”这样的格式,接收的话,一般也是这样的。

具体的东西,其实也不难,只要你掌握了发送和接收,其他的都好说。

我给你贴主要代码。

1、发送,这里是参考了网上别人的代码,可以用,里面的一些方法,你可以找我要 master@buxiaolong.com

byte[] defByte = new byte[6]

//设备号

string str1x_03 = SendDataDevice.ToString() // "1"

string str1_03 = ""

Boolean Macvalid1_03

AppCode.MonitorHelper.formatstring(str1x_03, 2, out str1_03, out Macvalid1_03)

byte[] numbyte1_03 = AppCode.MonitorHelper.mysendb(str1_03)

defByte[0] = numbyte1_03[0]

//功能码 - 03

string fun_str1_03 = "03"

byte[] fun_numbyte1_03 = AppCode.MonitorHelper.mysendb(fun_str1_03)

defByte[1] = fun_numbyte1_03[0]

//起始地址

string str2x_03 = AppCode.ClientDefine.dt_sendDataList.Rows[SendDataIndex]["DataSend"].ToString() //"0311"

AppCode.ClientDefine.SendData = AppCode.ClientDefine.dt_sendDataList.Rows[SendDataIndex]["DataSend"].ToString() //"0311"

string str2_03 = ""

Boolean addrvalid1_03

AppCode.MonitorHelper.formatstring(str2x_03, 4, out str2_03, out addrvalid1_03)

byte[] numbyte2_03 = AppCode.MonitorHelper.mysendb(str2_03)

defByte[2] = numbyte2_03[0]

defByte[3] = numbyte2_03[1]

// 数据数量(长度)

string str_num_03 = "1"

string str_num2_03 = Convert.ToString(Convert.ToInt16(str_num_03), 16)

string str3_03 = ""

Boolean value_valid_03

AppCode.MonitorHelper.formatstring(str_num2_03, 4, out str3_03, out value_valid_03)

                if (value_valid_03)

                {

                    byte[] numbyte3_03 = AppCode.MonitorHelper.mysendb(str3_03)

                    defByte[4] = numbyte3_03[0]

                    defByte[5] = numbyte3_03[1]

                    //计算CRC

                    byte crch = 0

                    byte crcl = 0

                    AppCode.MonitorHelper.CalculateCRC(defByte, defByte.Length, out crch, out crcl)

                    // MOVE给新的数组

                    byte[] rebyte = new byte[defByte.Length + 2]

                    for (int i = 0 i < defByte.Length i++)

                    {

                        rebyte[i] = defByte[i]

                    }

                    rebyte[6] = crcl

                    rebyte[7] = crch

                    mainPort.Write(rebyte, 0, rebyte.Length) // 发送 

                    Thread.Sleep(50) //暂停50 ms

                    //

                    /*

                    string strSend = ""

                    for (int i = 0 i < rebyte.Length i++)

                    {

                        strSend += string.Format("{0:X2} ", rebyte[i])

                    }

                    MessageBox.Show("发送数据:" + strSend)

                    strSend = null*/

                }

其中mainPort是一个全局(整个项目全局)的SerialPort对象

2、接收

void mainPort_DataReceived(object sender, SerialDataReceivedEventArgs e)

        {

            string errorMsg_d = ""

            try

            {

                Thread.Sleep(40)

                byte[] bs = new byte[mainPort.BytesToRead]

                mainPort.Read(bs, 0, bs.Length)

                errorMsg_d = bs.ToString()

                string str = ""

                for (int i = 0 i < bs.Length i++)

                {

                    str += string.Format("{0:X2} ", bs[i])

                    errorMsg_d += str + "|"

                }

                str = str.Replace(" ", "")

                //MessageBox.Show(str)

                //CheckSendData(str) //检测要发送的数据,看是属于哪一个的,就发送给谁

                //Thread.Sleep(200)

            }

            catch (Exception ex)

            {

                

            }

                

        }

其中,接收到的数据就是str,是一组16进制的数据,需要转换。

这就是主要的代码,其实差不多就够了。

希望能帮到你。这是思路。

目前我所做的功能是监控11个电表的各个数值,并有报警功能!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9910102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存