2016-03-09 82 views
-4

我正在使用Linux机器与PLC进行通信。 PLC和Linux机器在本地网络内连接,并使用UDP/IP作为基本协议。此外,端口号码是固定在两边。使用pthreads执行同步和异步通信的C/C++代码

这种通信需要实现:
要求1:Linux机器能发送命令(每次一个命令)到PLC。收到每个命令后,PLC将在50ms内以成功/失败消息响应Linux机器。
要求2:反之亦然,PLC可以向Linux机器发送命令。 Linux机器必须在50ms内回复消息。 PLC发送到Linux机器的是异步。因此,Linux机器需要连续监视(或监听)端口。

简单的C/C++代码已被用于单独测试有关上述要求的通信。有效。但阻塞机制进行了。

这里是具有挑战性的部分。我想用pthreads来进行这样的通信。我的解决方案是简单地为每个需求创建两个线程。我勾勒使用附加PIC https://www.dropbox.com/s/vriyrprl7j6tntx/multi-thread%20solution.png?dl=0我的思想,以“线程0”表示主线程,“线程1”表示要求1个线程和“线程2”表示要求2线程。 '共享数据'表示可以在所有子线程中共享的数据。 '线程1数据'专用于线程1的使用,其他线程不会访问。同样,“线程2数据”仅被线程2使用。

考虑到两个线程将在同一个端口上进行系统调用,我担心会升高。因此,我需要对我的解决方案进行评论,并且获得更多工作解决方案将会非常棒。附:我并不太担心线程同步和创建。如果您的解决方案中需要线程同步和创建,这对我来说非常酷。

在此先感谢。

+1

Stackoverflow不是问这样的开放式问题的地方。但有些想法。你并没有真正给出任何转向线程体系结构的强有力理由。最近我能看到的是旧的解决方案是一个“阻止机制”,你想避免这种情况。但避免一个特定的机制不应该是最终目标。关于“阻塞机制”(你已经说过的工作)是什么问题(例如它是否不符合时间要求)?要达成解决方案,首先必须了解带来的问题。只有这样我们才能决定线程是否有意义。 – kaylum

+0

请注意,实现异步体系结构不需要线程化。 – kaylum

+0

@kaylum感谢您的回复。我需要制定一些规范。 –

回答

0

在同一套接字上执行系统调用的两个线程没有一般问题。您可能会遇到的一些具体问题,但:

  • 如果你调用两个线程recvfrom()(一个等待PLC发送请求,另一个等待PLC对一个命令,从服务器响应) ,你不知道哪一个会收到回应。为了解决这个问题,你可以专门从PLC读取一个线程,并使用共享队列或类似的结构将响应消息从PLC传递到发送线程。

  • 当你关闭一个可能被另一个线程使用的套接字时,你必须小心 - 由于文件描述符被重用的方式,很容易出现竞争条件,最终导致一个线程作用于错误插座。

+0

感谢您的建议。 –