技术论坛

S7 1500 C# SOCKET编程案例实验(持续更新)

作者 主题
侠士

经验值: 1489
发帖数: 161
精华帖: 0
主题:【探讨】S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 2021-08-25 09:45:28

目的 :  想做一个s7和socket易用的通信程序。 编程语言实验阶段可选 vb.net  或者C#.net。

网络上我搜索了MSDN各工控论坛各大贴子,或者没公开或者处于入门水平。

实现功能 : 初级功能  ,

 1.  socket 标准应用, PLC做服务器, PLC端程序。 C#做客户端,   创建socket 收发 ;服务器绑定;监听收发数据,        目标达到能通信上。

  2.  plc包括数据块非优化地址的导出标签,用excel ,  让C#端socket包数据变得透明,收发数据通过标             签。地址高低字节自动转换程序,根据数据类型完成16进制到UI端显示,  发送数据转换编码16#到               SOCKET.

  3. 处理socket流控制异常。    

  4.  计算机多线程,面向连接应用,断线后自动连接 。

时间可以很长,有时间我就搞一点,争取做到最后。


只代表个人观点学习用, 错误之处请指正。 



bilibili 工控贵族
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1712223&b_id=5&s_id=0&num=19

版主

经验值: 69053
发帖数: 12266
精华帖: 59
回复:S7和SOCKET编程案例实验(持续更新)


只看楼主 1楼 2021-09-02 16:02:56

嗯嗯,可以哦,期待更新哈


做好了就是一个调试工具了


Q群:https://jq.qq.com/?k=9BDuEgf6
以下网友喜欢您的帖子:

  
侠圣

经验值: 2331
发帖数: 382
精华帖: 3
回复:S7和SOCKET编程案例实验(持续更新)


只看楼主 2楼 2021-09-03 01:11:08

期待中,有总结最好了,有空我也能贡献一些。


实际上一直有一个问题,就是当网络中断,如网线拔掉,可能整个进程就回失去响应,请问这个有解决办法吗?


工艺第一& 我所说的一切均代表个人意见
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7和SOCKET编程案例实验(持续更新)


只看楼主 楼主 3楼 2021-09-19 16:41:24

第一条,  plc  s7 1500  做服务器, 用到开放式用户通信里的两个块。  TSEND_C  TRCV .  这两个块组态和例程西门子论坛都是有的。 我在网上找了一段C#程序,  通信是可以通上的, 正在试验 C#向PlC发数据的程序。     如果C#的发送缓冲区小于PLC的接收缓冲区 , 会发现什么情况呢?答案就是如下图,  这样使PLC缓冲区要装满才会接收到数据   。  所以要两者缓冲区相等,或者整数倍,或者想办法标准化缓冲区。  















bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 4楼 2021-09-20 09:51:25

客户端端口是动态生成的,  初始化连接服务器地址和端口是固定的。 客户端和服务器 ,是两个不同的端口,地址在同一网段;不同的网段,需要路由器。





bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 5楼 2021-09-20 11:04:52

在网上找了下TCP/IP的知识 , 补习一下。   

数据链路层的地址是MAC  也就是网卡地址   例如:08:00:20:0A:8C:6D,

 IP层的地址是类似于192.168.1.1这样的IP地址 ,

TCP层的地址是程序地址 ,  由端口号确定。


下面这个图表示端口号为何可以不一致, 源端口号和目标端口号,  不存在必然联系, 但有一部分端口号功能是确认的。 如下图2 。 



我翻了下, 这个tcp 6   的协议号表示什么呢,   UDP或者TCP .



图2 


bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 6楼 2021-09-20 11:07:22

数据包处理流程  这个应该放在5楼前面。





bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠圣

经验值: 4243
发帖数: 583
精华帖: 3
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 7楼 2021-09-20 11:25:40

这种方式不大合适,刚好我手头上两个项目与1214、1516PLC实现高速通讯,用的C# WPF MvvM框架,后台多线程自动读写数据,双十一过后有时间了,我总结一下发出来。


 
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 8楼 2021-09-20 18:11:50

如果 C#一次向PLC发送数据 byte[10]  ,    TRCV设置的缓存区是byte[2]  , 那接收过程是怎么样的呢。 

观察到的, 感觉 PLC的系统缓存区也是byte[10],  这个系统缓存区和程序设定的byte[2]不是一个概念  .

PLC端2S接收一次,那么这10个字节的数据会丢失吗。  答案是不会。 C#发送 1234567890,plc第一次接收 12 , 第二次34 ,第三次 56 , 第四次 78  ,第五次90      太神奇了, 有点兴奋。

  


bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 9楼 2021-09-20 18:29:19

如果 C#500ms向PLC发送一次10个字节,共发两次;  PLC  TRCV缓存设置byte[2] ,2s接收一次数据 ,  那么接收会丢失数据吗,   答案是不会。 只要连接没有异常或者关闭  , 这些数据全部安全传送。


bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 10楼 2021-09-23 12:27:18

继续实验    C#接收端。




接收时间短, socket没接收完就取出来 。  所以C# 要知道 socket里是不是60000个字节。

还没想出办法来  ,解决方法就是异步接收,回调。

beginreceive



bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 11楼 2021-09-23 14:25:20

继续测试数据准确性  程序里服务器第一次发送的 [0]==0  [65535]==0

第二次发送的 [0]==97  [65535]==98 ,   最后一次 [0]==99  [65535]==100  服务器发送完, 客户端1s1S接 收一次。    执行和程序符合。  这应该叫异步接收 




bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 12楼 2021-09-25 16:40:00

掉线后再次连接的问题。当前的认识 。    对于C#客户端和C#服务器,  服务器通过监听线程。  有客户端连接请求时。自动连接,连接断开时,关闭当前连接。 PLC做服务器,SOCKET是单线程的(如果错了再更改),   把客户端请求做成多线程。如果SOCEKET连接不成功 ,就在线程里请求,不知道可行吗?


bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 13楼 2021-09-25 20:36:45

理想中的通信 示意图,  最近也看到snap7了。  谁看看怎么写?C#到PLC  




bilibili 工控贵族
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 14楼 2021-09-27 19:53:16

继续更新掉线重连接问题 。

1  .服务器PLC端不掉线 ,  C#端掉线, 这个能直接再次连接上, 这里不处理。

2.  服务器PLC端掉线,  C#端不掉线。下面讨论一下这个。

    首先 在C#里创建线程,但最大线程数是1个。

   

        private static int a = 0;

        static void Main(string[] args)

        {

            //设定服务器IP地址            

            while (true)

            {


                if (a <1)

                {

                    Thread mythread = new Thread(clinetstart);

                    mythread.Start();

                    a =1;

                }             

            }

        }

其次 ,在这个线程里, 创建socket ,连接到服务器请求,  读数据。  注意有异常时,a=0 ,关闭socket和线程。  这样a=0 又会重新创建一个线程。


      static void clinetstart( )

        {

            IPAddress ip = IPAddress.Parse("127.0.0.1");

            Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try

            {

                //clientSocket.BeginConnect(ip, 8885, null, null);

                clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口  

                Console.WriteLine("连接服务器成功");

            }

            catch

            {

                Console.WriteLine("连接服务器失败,请按回车键退出!");

            }

            //通过clientSocket接收数据  

            while (true)

            {

                try

                {

                    Thread.Sleep(500);


                    if (!clientSocket.Connected)

                    {

                        

                        //clientSocket.BeginConnect(ip, 8885, null, null);

                        clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口

                    }


                    int receiveLength = clientSocket.Receive(result);


                    //Encoding.ASCII.GetString(result, 0, receiveLength);

                    Console.WriteLine("接收服务器消息:{0},result[0]{1} ,result[65535]{2} 字节长度{3}", DateTime.Now, result[0], result[65535], receiveLength);

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex.Message);

                    Console.WriteLine(clientSocket);

                    //clientSocket.Shutdown(SocketShutdown.Both);

                    a = 0;

                    clientSocket.Close();

                    Thread.CurrentThread.Abort();

                    

                }


            }

        }


如果有问题后面会完善, 上面是初步。

远程主机强迫关闭了现有的一个连接 , 这个就是我把服务器关闭了。

由于目标计算机积极拒绝,无法连接,是因为服务器不存在。


bilibili 工控贵族
以下网友喜欢您的帖子:

  
新手

经验值: 31
发帖数: 2
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 15楼 2021-10-29 17:48:54
以下是引用flyfeky在2021-09-25 20:36:45的发言 >13楼

理想中的通信 示意图,  最近也看到snap7了。  谁看看怎么写?C#到PLC  



HSL COMMUNICATION OR xktcommon


 
以下网友喜欢您的帖子:

  
侠士

经验值: 1677
发帖数: 377
精华帖: 2
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 16楼 2021-10-30 22:21:06

这个真不错,值得学习,干工控的需要学C#和JS,不然赶不上时代了。


我爱工控!尤爱西门子!
以下网友喜欢您的帖子:

  
奇侠

经验值: 7134
发帖数: 1022
精华帖: 2
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 19楼 2022-12-08 09:03:23

不知道PYTHON能否实现?


心有多远路就有多远
以下网友喜欢您的帖子:

  
游民

经验值: 79
发帖数: 1
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 20楼 2023-03-26 16:35:29
python可以实现,我也正在做同样的事情
 
以下网友喜欢您的帖子:

  
侠士

经验值: 1489
发帖数: 161
精华帖: 0
回复:S7 1500 C# SOCKET编程案例实验(持续更新)


只看楼主 楼主 21楼 2023-06-25 22:06:23

过了很久了,继续更新一下,  SOCKET 读全部变量是没有问题了,  不过要自己写每个变量的类型,DB里起始地址作解析。 写数据的话,我考用S7。  这样大量数据也没有什么问题了。  问题:  如果西门子有API ,初始化时,我直接用C# 拿到DB里数据的类型,偏移量, 那是不是就相当有了转换的协议了,卡壳。



20230807  

问题全部解决, 只是用了很长时间。  已经实现了把变量标签,地址放到表格里,WPF绑定标签。 完美结帖。





20230829  后续,  博图.db 文件,  是可以用C#解析的,  我已经解析成功, 在我其他帖子有介绍。





bilibili 工控贵族
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
S7 1500 C# SOCKET编程案例实验(持续更新)
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。