牛骨文教育服务平台(让学习变的简单)

OHSCE入门教程(三)-PHP串口通信、构建高可靠性的总线

(写于OHSCE_V0.1.25)

终于等到这篇文章了吧,其实之所以先写了TCP/UDP的是因为在现在的环境下它俩是相辅相成的,其实在控制领域我们所说的TCP/UDP和串口总线应用非常接近,和普通的互联网网络应用还是有着很大区别的,毕竟绝大部分网络控制产品都是从总线控制产品升级而来或沿袭了可靠的设计而产出的,本质上基本是一样的(这也就是为什么在使用OHSCE完成您的需求能够让您“稀里糊涂”的顺利躲过了很多使用其它办法时的坑)。控制领域是个很宽的领域,它包含了或有交集于时下热门的物联网万物互联、工业4.0智能制造、行业智能化、人工智能、各种与控制相关的云等云云种种。

有人表达说"控制的世界没有异步",这句话说来也对也错,一个继电器或是开或是闭同一时间只有一种状态,每一步逻辑都是缜密的,工艺越复杂系统越庞大对可靠性的要求越高。随着系统集成的需求越来越深,互联网+的概念侵入和发展,事情被诠释的越来越多元化。不过话又说回来,对高可靠性的要求是永远一成不变的,毕竟是控制。虽然现在一些诸如采集手环,随身血压采集等物联网应用因业务场景简单所以一些不可靠的问题暂时不会酿成事故,但随着业务复杂度的提升和系统集成度的提高开发者很快就会意识到这个道理。

一、OHSCE中的封装函数。

主要分为封装函数和基础函数,绝大多数的需求使用封装函数即可完成,但是OHSCE也提供给您了操作更接近底层的基础函数库。

Ohsce_eng_serial_X 是您在构建串口总线应用时主要应用的封装函数。

绝大多数情况,任何串口设备或总线网络在上位机/网关的角度上看,通信的门就是那几个电气接口首先你先要高清你使用的是哪个串口,我们演示使用COM7(由USB转发485)。

(*设备上常见直接有的接口:RS232<俗称9针>、RS485、RS422、USB<通用串行总线基本是机器都有>、TTL(常见于单片机)等等等等等....)

想使用OHSCE中的所有函数很简单,只需要引入OHSCE的加载文件即可。

<?php
ini_set("memory_limit","88M");//重置php可以使用的内存大小为88M
set_time_limit(0);
ob_implicit_flush(1);
include("loadohsce.php");
(获取OHSCE: http://www.ohsce.org & https://github.com/OpenIBC/Ohsce)

二、创建一个串口资源

Ohsce_eng_serial_creat 可以为您创建一个完备的串口资源,该资源可以复用可以克隆,您之后的所有操作均可以通过该函数所创建的资源完成。

Ohsce_eng_serial_creat($hscecom,"com7",1,0,9600,"n",8,1);
这行代码为您创建了一个变量名为$hscecom的指定串口为com7,并且以读写方式打开(1),使用原生底层函数操作(0),波特率为9600,无校验位,数据位为8,停止位为1的资源。其实如果您恰巧就是在使用9600,n,8,1完全可以写的再短点,它和下面这段代码是等同的,因为OHSCE默认会为您填充全部参数。

hsce_eng_serial_creat($hscecom,"com1");

其实除此之外此函数可以设置更多的参数。具体请参考OHSCE的手册->函数参考

Ohsce_eng_serial_creat(&$OHSCESerial,$com,$flags="1",$mode=0,$baud=9600,$parity="n",$data=8,$stop=1,$fc="none",$xon="off",$to="off",$octs="off",$odsr="off",$idsr="off",$dtr="on",$rts="on",$space=0)
当您创建完成这个资源的时候其实默认载入了3ms的发送延迟,这是一个全局值,在创建时被写入资源。若要改变这个间隔除了改变space参数外(注意为0时失效),需要使用Ohsce_eng_serial_setspace函数(0值有效)。但是不建议您消除这个间隔,近乎任何情况下它的存在只会有益无害。

三、打开一个串口资源并占用这个接口

非常简单的一行,就可以让您的进程打开一个资源并占用所指定的串口。

Ohsce_eng_serial_open (内置函数)

Ohsce_eng_serial_open($hscecom);
值得注意的是,一般情况下一个串口同一时间只能被一个资源所占用,当您需要在两个进程之间交替时需要先使用close释放。(_M_X系版本提供的多进程共同占用一个串口实际上是提供了一个缓冲进程做到,本质上还是一个由一个进程占用。)

四、写与读的操作

大部分总线设备均是上位机轮询的模式,虽然也有一些设备是主动上报但是我们认为轮询的模式设计更为合理故我们演示的也是先写后读。

此时我们演示一次在RS485总线上使用MODBUS-RTU协议读取设备保持寄存器的操作。

Ohsce_eng_serial_write($hscecom,"01030001000415c9",true);
向串口设备发送数据,后面的true表示是以16进制发送。(这个以16禁止发送的意思是您发送的数据输入的是16进制格式的"01030001000415c9"而不是"100000011000000000000000100000000000001000001010111010000"的意思。)

读取设备的返回。

usleep(3000);
Ohsce_eng_serial_read($hscecom,$data,null,true);
读取串口数据 返回数据长度为未知 以16进制返回。其中$data变量中存的就是返回的数据。

五、记得关闭您的串口资源。

Ohsce_eng_serial_close($hscecom);
关闭一个资源并不会将这个资源清空删除,只是释放了此串口的控制权方便另一个进程继续调用使用此串口。当然如果您需要让您的这个进程保持占有此接口的话就不要调用这个函数啦。

六、花絮函数

Ohsce_eng_serial_comwr -进行一次连续的写读操作

Ohsce_eng_serial_npcomwr-使用额外的全新的进程进行一次连续的写读操作(基础环境必须运行中)。操作结束后额外的进程会立即结束。

(OHSCE的PRO扩展也会带来一些函数如ohsce_ext_modbus_x ohsce_ext_profibus_x等等,我们会在扩展的说明书详细阐述。)

七、打磨您的工艺细化您的控制流程,并保持更新您的OHSCE框架至最新的稳定版本。

OHSCE愿每一名控制工程师都可以搭上互联网+的翅膀,每一名PHPWEB工程师都可以冲在物联网的前言,我们的程序是您可靠的基石。

 官方网站:http://www.ohsce.org & http://www.ohsce.com

 开发者QQ群:374756165

 GITHUB:https://github.com/OpenIBC/Ohsce

 手册地址:http://www.ohsce.com/index.php/book/