Modbus TCP/IP 一个客户端,对多个server,如何编程?

houzc2009 2011-05-26 09:48:28
各位达人:
小弟做一个触摸屏的项目,触摸屏下边通过RS485接32各PLC,触摸屏读取各PLC的温度数据存储在触摸屏的内存中,同时触摸屏支持modbus tcp 协议,可作为server供上位机读取数据。现在拟上位机循环读取不同触摸屏(IP地址不一样)的数据。上位机作为Cient,各触摸屏做Server。等于一个Client对应多个Server。问题:上位机中如何建立多个连接?接收数据缓冲区是否也需要多个?如果上位机收到数据后直接存到数据库里,是否只用一个接收数据缓冲区就OK了?
...全文
4375 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
18821 2014-01-22
  • 打赏
  • 举报
回复
创建多个任务线程就OK了
wenqibiao8 2013-08-20
  • 打赏
  • 举报
回复
这没有问题啊。TCP是(host IP + host port, remote IP + remote port)构成一个连接的。
xjtdong 2012-08-17
  • 打赏
  • 举报
回复
你那个程序怎么样了?我现在也碰到此类问题!是否能实现1对多?
  • 打赏
  • 举报
回复
你那个写的怎么样了????
  • 打赏
  • 举报
回复
我也在整,希望聊聊。
  • 打赏
  • 举报
回复
搞定没?
houzc2009 2011-05-27
  • 打赏
  • 举报
回复 1
我思路没有问题!
PC机作为上位机,称为MODBUS TCP client,下位机(多个)触摸屏HMI称为MODBUS TCP Server。
也有叫做上位机,称为MODBUS TCP MASTER,下位机(多个)触摸屏HMI称为MODBUS TCP SLAVE。但意思一样------就是上位机向下位机主动发起连接,下位机等待建立连接,你说下位机是不是叫做Server?所以说叫做----一个客户端对多个服务器!

有这方面的答案吗?谢谢!


net119net110 2011-05-27
  • 打赏
  • 举报
回复
一个客户端对多个服务器?

你思路有问题吧。

看看是不是思路搞反了?
1、利用“naga-2_1-r42.jar”包进行二次开发; 2、调用NIOService类中的打开socket和serverSocket函数进行编程; 3、例如,服务器端: NIOService service1 = new NIOService(); NIOServerSocket serverSocket = service1.openServerSocket(port); // 设置监听事件,包括打开监听后,关闭后这两个: serverSocket.listen(new ServerSocketObserverAdapter() { public void newConnection(NIOSocket nioSocket) { // 可在此处添加处理事件 } public void serverSocketDied(Exception exception) { // 关闭serverSocket处理 } }); // 还需要一个循环事件,执行事件监听,此处可能需要使用到多线程编程 // 设置接收链接方式 serverSocket.setConnectionAcceptor(ConnectionAcceptor.ALLOW); while (true) { // 循环不断监听事件 service1.selectBlocking(1); } 4、又例如,客户端,包括链接上,接收包,关闭链接后三个事件和write()方法: NIOService service2 = new NIOService(); NIOSocket socket = service2.openSocket(InetAddress.getLocalHost(), port); // 设置接收包格式 nioSocket.setPacketReader(new RegularPacketReader(1, true)); nioSocket.setPacketWriter(new RegularPacketWriter(1, true)); nioSocket.listen(new SocketObserverAdapter() { public void connectionBroken(NIOSocket nioSocket, Exception arg1) { // 打开后处理 System.out.println("Client ip:" + nioSocket.getIp() +" port:"+nioSocket.getPort()+ " disconnected."); nioSocket.close(); isConnected = false; } public void connectionOpened(NIOSocket nioSocket) { // 关闭链接后处理 System.out.println("Client ip:" + nioSocket.getIp() +" port:"+nioSocket.getPort()+ " connected."); } public void packetReceived(NIOSocket nioSocket, byte[] packet) { revNum = nioSocket.getBytesRead(); // 包处理 revDataAndParse(packet); }}); // 还需要一个循环监听事件并执行,此处可能需要使用到多线程编程 while (true) { service2.selectBlocking(1); } 5、该项目开发过程基本上是以上3、4点的封装过程,利用接口编程,实现一个客户端基础类(TCPClientBase) 和服务器端基础类(TCPServerBase),其中客户端基础类有两种方式,一种是使用于单独的客户端的单元;另 一种使用与服务器端接收一个链接后的单元; 6、项目类使用: 1) communication.tcp.client.TCPClientBase是基础抽象类,任何外部使用都必须继承该类,并重写一 个“protected abstract void revDataAndParse(byte[] data);”方法,建议外部重写时,设置成protected&private 以防止类外部调用。同样在继承该基础类时,可以在继承类中添加各种需要的引用及必要的方法,实例在 communication.tcp.example.TCPClientUnit体现,重写revDataAndParse方法如下: /** * 处理数据将数据置于队列中,或者直接解析....... */ protected void revDataAndParse(byte[] data) { // SystemOut.arrayToHexString(data); // sendData(data); // System.out.println(new String(data)); } 2) communication.tcp.server.TCPServerBase也是基础抽象类,任何外部使用都必须继承该类,并重写至少包括一些内容: /** * 服务器端构造方法 * @param ip * @param port * @throws ClassNotFoundException */ @SuppressWarnings("unchecked") public TCPServerUnit(String ip, int port) throws ClassNotFoundException { // 注意保持与泛型中的类一致性 super(ip, port,(Class<TCPClientUnit4Server>) Class.forName(TCPClientUnit4Server.class.getName())); } 7、弊端:程序为未经过严格的验证,使用效果如何未知;客户端中的接收包有一定的局限性,接收数据包不利于开发解析,对于实时性要求比较 高的系统不一定适用,如modbusTCP。 8、详细使用过程,请参考doc目录中的api帮助文档。

1,977

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 其他语言讨论
社区管理员
  • 其他语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧