求教c#通过GPRS模块连接PLC问题

时间:2022-10-03 17:36:23
大神们好,我现在正在做的一个项目是用的c#远程读写PLC寄存器,采用GPRS模块进行远距离传输,也就是需要实现TCP/IP到ModBus协议的通信,由于没有PLC硬件暂时用Modbus slave来模拟PLC的寄存器情况,GPRS模块通过串口接到运行slave软件的电脑作为从机,另一台电脑作为主机,用了网上的NModBus通用类,目前串口通信成功,按照从机IP进行TCP通信成功,但是根据GPRS模块获取的动态IP进行通信时却总是无法返回结果,经测试从机串口部分已经接收到数据,请大神们给分析下原因,另外咨询一下tcp/ip 到modbus通信是否可以使用除502外的端口,查过一些资料说这俩个协议默认是用502端口的,如果要改的话要同时改主机端口以及plc端口,以下是部分代码:
这是串口通信,测试成功。

            using (SerialPort port = new SerialPort("COM1"))
            {
                // configure serial port
                port.BaudRate = 9600;
                port.DataBits = 8;
                port.Parity = Parity.None;
                port.StopBits = StopBits.One;
                port.Open();
                // create modbus master
                IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(port);
                byte slaveID = 1;
                ushort startAddress = 1;
                ushort numRegisters = 1;
               ushort[] temp = master.ReadHoldingRegisters(1, 1, 1);
                    textBox2.Text = temp[0];

            }


这是tcp通信部分,测试成功:

TcpClient tcpClient = new TcpClient(); //Create a new TcpClient object.
            tcpClient.BeginConnect("xxx.xxx.xxx.xxx", 502, null, null);
            ModbusIpMaster master = ModbusIpMaster.CreateIp(tcpClient);
            ushort[] temp = master.ReadHoldingRegisters(1, 1, 1);
            textBox2.Text = temp[0];

换成GPRS方式就不行了:

IPAddress ipAddress = IPAddress.Any;
            tcpListener = new TcpListener(ipAddress, 502);
            tcpListener.Start();//
             //开启接收线程               
            var listenThread = new Thread(ListenConnect);
            listenThread.Start();

/// <summary>
        ///     监听器
        /// </summary>
        private void ListenConnect()
        {
            while (true)
            {
                


                TcpClient tcpClient = tcpListener.AcceptTcpClient();
               //……此处略过部分中间过程
               ModbusIpMaster master = ModbusIpMaster.CreateIp(tcpClient);
//IModbusSerialMaster master = ModbusSerialMaster.CreateAscii(client);试过这个方法也不行
               jfwd = master.ReadHoldingRegisters( 1,0, 1)[0];//这里一直处于阻塞状态无法返回数据
             }
          }

2 个解决方案

#1


楼主使用的是C/S架构 测试一下设置成sever模式是否能够成功

#2


引用 1 楼 woshi_ziyu 的回复:
楼主使用的是C/S架构 测试一下设置成sever模式是否能够成功

已经通讯成功了,原来错误的地方因为引用dll里面的一个死循环,不过还是非常感谢你的回答

#1


楼主使用的是C/S架构 测试一下设置成sever模式是否能够成功

#2


引用 1 楼 woshi_ziyu 的回复:
楼主使用的是C/S架构 测试一下设置成sever模式是否能够成功

已经通讯成功了,原来错误的地方因为引用dll里面的一个死循环,不过还是非常感谢你的回答