完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
首先我们所遇到第一个问题,在使用 TCP/IP READ 的时候,上方的 Mode 预设为 Standard,Standard 代表我必须要设定需要读回来的 Bytes 数量,如下图所示。
除非 Server 跟 Client 双方约定好传输的资料永远都是固定某个数量的位元组做传输,在一般的情况下,对读取端而言是无法得知发送端所传送的资料有多少,因此上方的 Mode 还有一些其他的选项让我们可以参考,笔者直接复製 labview Help 来引述。 稍微解说一下在: Standard Mode,给予要读取的 Bytes 数,在 timeout 时限内没有足够的资料,会把部分资料回传并且传送出 Timeout Error。 Buffered Mode,给予要读取的 Bytes 数,在 Timeout 时限内没有足够的资料,会回传空字串并且传送出 Timeout Error。 CRLF Mode,如果在记忆体空间中,有遇到 Carriage 与 Line Feed 这两个字串,不管你设定多少 Bytes数,都会中断把CRLF之前的资料回传。这个模式是一般 Modbus 都使用的模式。 Immediate Mode,如果送来的资料小于你设定要读取的 Bytes,他会有机制读取到该资料,如果记忆体内完全没有资料就会触发 Timeout Error。 实际上在做资料传递时,我看了网路上使用的一些範例,很多使用者会使用 CRLF Mode,因为使用的难度比较低。我比较会使用 Standard Mode,然后自行定义 Protocol 来做,Protocol 首先利用前面 4 Bytes 来告知我的资料长度,先行传送给对方,接着将资料再进行传递,如下图所示。 在实际的使用后,我发现资料的长度如果太长,也会造成一些错误及非稳定的情况发生,所以后来改良,先将资料进行拆解,设定每 500 Bytes 就先行传送过去,如上图的说明2部分,再逐步的使用 TCP Write 来传送。 相对的在接收部分也要分成两个阶段来进行,首先接收4 Bytes的资料来解析资料长度,接着判断要分成几次来接收,接收后再将字串进行接合,如上图所示。自行定义Read与Write后,就不会再有未知资料长度的困扰了。 另外在 Server 的撰写上其实也有一个麻烦的地方,就是 Server 其实是具有一对多的能力的,若是像上个单元的範例来设计 TCP/IP 的 Server 与 Client,只使用了 Server一对一的能力,没有使用到一对多的能力,因此要如何撰写出 Server一对多的程式,也是一个课题。首先要具备的能力就是要了解多执行绪的程式概念,将成是分成两个单元,一个执行绪负责去处理 Client 连线上来的部分;另一个执行绪去负责已经连上的 Client,其资料的传递与动作。在这边我画了一个简易的流程图如下所示。 依照流程图我们可以开始进行程式的撰写,下图为主程式。其实我这个範例还不是完全的针对每个 Client 来製作平行执行绪,只是简易的将 Client ID 堆积起来,批次依序处理,上方迴圈负责等待 Client 连线,如果连线成功时,利用 Functional Global Variable 将 Connection Ref 给储存起来。下方的迴圈先将 Functional Global Variable 储存的 Connection Ref 给捞出来,依序去读取记忆体中接收到的资料,再去跟续资料进行不同的 Process,每次进行完就去检查 Error Line 中有没有连线错误讯息,若是有错误则是放掉 Connection Ref。 这边只是一个简单的示意程式码,下方简单的呈现其中几个 VI 的 Block Diagram,你也可以根据自己的需求去自行定义 TCP/IP 的 SubVI 使用。 Check.vi 检查错误码 Manager.vi 管理 Connection Ref 等资料 Close.vi 关闭 Connection Ref |
|
相关推荐
1 个讨论
|
|
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 23:44 , Processed in 0.547534 second(s), Total 49, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号