modbustcp封装使用获取设备数据示例
//接受数据请求
public function client($pz){
//参数1是:网络协议,
//AF_INET: IPv4 网络协议。TCP 和 UDP 都可使用此协议。一般都用这个,你懂的。
//AF_INET6: IPv6 网络协议。TCP 和 UDP 都可使用此协议。
//AF_UNIX: 本地通讯协议。具有高性能和低成本的 IPC(进程间通讯)。
//参数2是:套接字流,选项有:
//SOCK_STREAM TCP 协议套接字。
//SOCK_DGRAM UDP协议套接字。
//参数3:protocol协议,选项有:
//SOL_TCP: TCP 协议。
//SOL_UDP: UDP协议。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//统一配置
$xgcs=array(
'surface'=>'equipment_config_'.$pz['surface'],//表名
);
$biao=db($xgcs['surface'])->where(array('id'=>1))->find();
$xgcs=array(
'identification'=>$pz['surface'],//唯一标识
'ip'=>$biao['ip'],//ip地址
'port'=>$biao['port'],//端口
'surface'=>'equipment_config_'.$pz['surface'],//表名
);
//获取数据字段表
$data_cxzd=array(
array('name'=>'tem_sub1_t3'),//二次供水温度,513,3
array('name'=>'tem_sub1_t4'),//二次回水温度,516,3
array('name'=>'pre_sub1_p3'),//二次供水压力,507,3
array('name'=>'pre_sub1_p4'),//二次回水压力,508,3
array('name'=>'pre_sub1_p1'),//一次供水压力,505,3
array('name'=>'pre_sub1_p2'),//一次回水压力,506,3
array('name'=>'valve_sub1_tcal'),//二次供水温度设定值,519,3
array('name'=>'tem_sub1_t1'),//一次供水温度,511,3
array('name'=>'tem_sub1_t2'),//一次回水温度,512,3
array('name'=>'tem_tout'),//室外温度,517,3
array('name'=>'valve_sub1_feedback'),//调节阀1阀位,518,3
array('name'=>'valve_sub1_controlmode'),//控制方式,22,1
array('name'=>'tem_sub1_t3hset'),//二次最大供水温度,514,3
array('name'=>'tem_sub1_t3lset'),//二次最小供水温度,515,3
array('name'=>'heatmeter_pri_power'),//总热功率,834,3
array('name'=>'heatmeter_pri_energy'),//总热耗,836,3
array('name'=>'heatmeter_pri_flow'),//一次侧流量,830,3
array('name'=>'cp_sub1_cp1frequency'),//循环泵1频率,502,3
array('name'=>'cp_sub1_cp2frequency'),//循环泵2频率,490,3
array('name'=>'heatmeter_sub1_flow'),//二次侧流量,530,3
array('name'=>'mp_sub1_mp1frequency'),//1号补水泵频率反馈,504,3
array('name'=>'mp_sub1_mp2frequency'),//2号补水泵频率反馈,592,3
array('name'=>'hmeter_ref_volume'),//补水累计流量,632,3
array('name'=>'heatmeter_pri_volume'),//一次网累计流量,832,3
array('name'=>'heatmeter_pri_flow'),//一次网瞬时流量,830,3
);
//获取的数据
$datas=array();
//转换参数(字段名、类型:bit则为线圈寄存器,其余则为保持寄存器、转换参数、寄存器地址)
$data_zhcs = db(\tname::register_relationship)->where(array('identification'=>$xgcs['identification']))->column('variable_name,variable_type,conversion_coefficient,register_address');
//建立链接
$con=socket_connect($socket,$xgcs['ip'],$xgcs['port']);
foreach ($data_cxzd as $k_1 => $value) {
//定义标识符
//转16进制
$value['qian4']=dechex($k_1);
//获取长度
$value['chang4']=strlen($value['qian4']);
//判断长度
if($value['chang4']==1){
$value['zu1_5']='00 0'.$value['qian4'];
}elseif($value['chang4']==2){
$value['zu1_5']='00 '.$value['qian4'];
}elseif($value['chang4']==3){
$value['zu1_5']='0'.substr($value['qian4'],0,1).' '.substr($value['qian4'],1,2);
}elseif($value['chang4']==4){
$value['zu1_5']=substr($value['qian4'],0,2).' '.substr($value['qian4'],2,2);
}
$value['zu6_21']=' 00 00 00 06 15 ';
//类型获取bit为线圈寄存器,其余为保持寄存器
$value['type']=$data_zhcs[$value['name']]['variable_type'];
if($value['type']=='bit'){
$value['zu22_23']='01';
}else{
$value['zu22_23']='03';
}
//获取10进制的寄存器
$value['jcq_10']=$data_zhcs[$value['name']]['register_address']-1;
//转16进制的寄存器
$value['jcq_16']=dechex($value['jcq_10']);
//获取16进制的寄存器长度
$value['chang_jcq']=strlen($value['jcq_16']);
//判断16进制的寄存器长度
if($value['chang_jcq']==1){
$value['zu24_29']=' 00 0'.$value['jcq_16'];
}elseif($value['chang_jcq']==2){
$value['zu24_29']=' 00 '.$value['jcq_16'];
}elseif($value['chang_jcq']==3){
$value['zu24_29']=' 0'.substr($value['jcq_16'],0,1).' '.substr($value['jcq_16'],1,2);
}elseif($value['chang_jcq']==4){
$value['zu24_29']=' '.substr($value['jcq_16'],0,2).' '.substr($value['jcq_16'],2,2);
}
//获取个数(这个基本不会改变,如若改变则接收要全改)
//判断是32位的变为02
if($value['type']=='int32'){
$value['zu30_35']=' 00 02';
}else{
$value['zu30_35']=' 00 01';
}
$value['zu']=$value['zu1_5'].$value['zu6_21'].$value['zu22_23'].$value['zu24_29'].$value['zu30_35'];
$sendStrArray[$k_1] = str_split(str_replace(' ', '', $value['zu']), 2); // 将16进制数据转换成两个一组的数组
for ($j = 0; $j < count($sendStrArray[$k_1]); $j++) {
socket_write($socket, chr(hexdec($sendStrArray[$k_1][$j]))); // 逐组数据发送
}
$receiveStr[$k_1] = "";
$receiveStr[$k_1] = socket_read($socket, 1024, PHP_BINARY_READ); // 采用2进制方式接收数据
$receiveStrHex[$k_1] = bin2hex($receiveStr[$k_1]); // 将2进制数据转换成16进制
//响应状态
$value['xyzt']=substr($receiveStrHex[$k_1],14,2);
//如果返回成功
if($value['xyzt']==$value['zu22_23']){
//返回参数(16进制)
$value['fhcs_16']=substr($receiveStrHex[$k_1],18);//截取数据
//转为10进制
$value['fhcs_10']=hexdec($value['fhcs_16']);
//进行换算
$value['value']=$value['fhcs_10']*$data_zhcs[$value['name']]['conversion_coefficient'];
//键入到修改数组
$datas[$value['name']]=$value['value'];
}
}
//断开链接
socket_shutdown($socket);
socket_close($socket);
$cc=db($xgcs['surface'])->where(array('id'=>1))->update($datas);
return $datas;
if($cc){
return 1;
}else{
return 0;
}
}
modbustcp封装使用获取设备数据示例的更多相关文章
- FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1. 列设备 ffmpeg -list_devic ...
- 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)
这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1. 列设备 ffmpeg -list_devic ...
- qt qml ajax 获取 json 天气数据示例
依赖ajax.js类库,以下代码很简单的实现了获取天气json数据并展示的任务 [TestAjax.qml] import QtQuick 2.0 import "ajax.js" ...
- Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据
当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...
- java调用windows的wmi获取设备性能数据
java调用windows的wmi获取监控数据(100%纯java调用windows的wmi获取监控数据) 转:http://my.oschina.net/noahxiao/blog/73163 纯j ...
- jQuery AJAX获取JSON数据解析多种方式示例
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- appium自动化测试框架——封装获取设备信息类
在上一节中,我们已经解决了如何在python中执行cmd,并获取执行结果.下面就小小实战一下,获取设备信息. 一.思路 1.windows上获取设备信息的方法 输入dos命令“adb devices” ...
- jQuery中使用Ajax获取JSON格式数据示例代码
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSONM文件中包含了关于“名称”和“值”的信息.有时候我们需要读取JSON格式的数据文件,在jQuery中 ...
- 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)
文章转载地址 http://www.vxzsk.com/87.html 设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ...
随机推荐
- jquery实现上一页下一页
注:文章转载于肖肖的博客: 简单说一下思路:就是把每个页面都用position:absolute的属性使每个页面都从叠在一起.然后通过$().hide()隐藏和$().show()显示.点击当前页中的 ...
- MVP 模式简单易懂的介绍方式
为什么用Android MVP 设计模式? 当项目越来越庞大.复杂,参与的研发人员越来越多的时候,MVP 模式 的优势就充分显示出来了. MVP 模式是 MVC 模式在 Android 上的一种变体, ...
- 大数据量报表APPLET打印分页传输方案
1 . 问题概述 当报表运算完成时,客户端经常需要调用润乾自带的runqianReport4Applet.jar来完成打印操作, 然而数据量比较大的时候,会导致无法加载完成,直至applet内存 ...
- 直到黎明 Until Dawn 后感
直到黎明 会免游戏.白金神作.近些年的恐怖电影都有游戏化的趋势,韩国的某岩vlog,美国的真心话大冒险,都把观众作为meta代入游戏,几乎模糊了游戏与游戏的边界,直到黎明这部电影,与当年的暴雨和超凡双 ...
- nodejs lodash的一些函数
1 _.compact用法 _.compact([0, 1, false, 2, '', 3,'mm']); var test = _.compact([-1,0, 1, false, 2, ...
- 回归JavaScript基础(七)
主题:引用类型Function的介绍. 今天首先说的就是Function类型.下面就是定义函数的两种方法,第一种使用函数声明语法定义,第二种使用函数表达式定义.这两种定义函数的方式几乎没有什么区别. ...
- Angular常用语句
循环执行 )* ))))); //重点 : 返回deferred.promise才能链式执行then方法 return def.promise;} log : function (msg) { con ...
- 远程监视jboss应用java内存的配置
前言 因为最近一个项目部署在客户那边运行一个月左右就会出现java内存溢出的问题,为了时时监控java内存的情况需要,需要远程查看服务器上java内存的一些情况.在公司模拟部署了远程监视linux下项 ...
- Windows自带强大的入侵检测工具——Netstat 命令 查询是否中木马
Netstat命令可以帮助我们了解网络的整体使用情况.根据Netstat后面参数的不同,它可以显示不同的网络连接信息.Netstat的参数如图,下面对其中一些参数进行说明.如何检测本机是否有被中木马, ...
- Elasticsearch安装记录
一 安装部分 1.新建用户 elasticsearch不能使用root身份执行 adduser esuser passwd esuser 2.赋予权限 切换到root chown -R esuser ...