//接受数据请求
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封装使用获取设备数据示例的更多相关文章

  1. FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

  2. 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)

    这两天研究了FFmpeg获取DirectShow设备数据的方法,在此简单记录一下以作备忘.本文所述的方法主要是对应Windows平台的. 1.       列设备 ffmpeg -list_devic ...

  3. qt qml ajax 获取 json 天气数据示例

    依赖ajax.js类库,以下代码很简单的实现了获取天气json数据并展示的任务 [TestAjax.qml] import QtQuick 2.0 import "ajax.js" ...

  4. Thinkphp3.2.3框架下封装公共的函数,例如封装CURL函数来获取接口数据

    当我们需要在控制层调用相同的封装函数时,写多次相同的函数,显得代码十分的拉杂,不精简: TP框架有一个很好的机制,可以再Common定义一个function.php函数,当我们在控制层调用的时候直接调 ...

  5. java调用windows的wmi获取设备性能数据

    java调用windows的wmi获取监控数据(100%纯java调用windows的wmi获取监控数据) 转:http://my.oschina.net/noahxiao/blog/73163 纯j ...

  6. jQuery AJAX获取JSON数据解析多种方式示例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. appium自动化测试框架——封装获取设备信息类

    在上一节中,我们已经解决了如何在python中执行cmd,并获取执行结果.下面就小小实战一下,获取设备信息. 一.思路 1.windows上获取设备信息的方法 输入dos命令“adb devices” ...

  8. jQuery中使用Ajax获取JSON格式数据示例代码

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSONM文件中包含了关于“名称”和“值”的信息.有时候我们需要读取JSON格式的数据文件,在jQuery中 ...

  9. 微信蓝牙设备开发教程之获取设备deviceid和二维码(3)

    文章转载地址  http://www.vxzsk.com/87.html  设备授权 调用 设备授权新接口 ,获取deviceid和二维码,然后利用获取到的deviceid更新设备属性(如mac地址, ...

随机推荐

  1. ubuntu中获取文件名称并生成txt文件

    简介: 在机器视觉学习过程中,通常会经常批量处理一些图片,在Ubuntu下可以使用find命令,来实现将文件名全部读取出来,生成列表txt文件,作为标签使用 (1)find命令格式如下: find / ...

  2. 黑客之google入侵网站常用方式 2

    一: 在搜索框上输入: “index of/ ” inurl:lib 再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍. 在搜索框上输入: “index of /” cnki 再按搜索你就可以 ...

  3. mvc里全局错误日志

    第一步在项目中找到App_Start文件夹下建立一个错误日志过滤器. 第二步在Global.asax文件中注册下日志过滤器 第三步: 继承一个ExceptionFilterAtrribute 第四步: ...

  4. vue + skyline 搭建 一个开发环境

    1.之前用的是ext +  skyline搭建环境 ,正好最近是做前端的事情,有时间用vue + skyline 搭建一个三维场景 2.准备vue 2.x  ,UI 用的是iview 和element ...

  5. Python 操作数据库pymysql

    import pymysql #添加数据 conn , user='root', passwd='', db='yyy') #更改获取数据结果的数据类型,默认是元组,可以改为字典等:#cursor=c ...

  6. Mac下驱动BCM20702A0 USB蓝牙

    偶然高了一个USB蓝牙,查到Mac下能识别,无法驱动,就去找了一下.方法很简单,就是把蓝牙的PID和VID加入到驱动里边去,具体方法和步骤如下: 1. 进入到/System/Libary/Extens ...

  7. vim和xshell配色

    xshell配色: http://www.hookr.cn/xshell-pei-se.html vim配色: 参考该文中的配置方法,包括设置256色等.http://www.cnblogs.com/ ...

  8. winform messagebox自动关闭

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. 用tableView实现的一种加载数据的布局

    用tableView实现的一种加载数据的布局 此博文是应朋友之邀解决他的业务逻辑问题 效果: 素材: 源码: ImageCell.h 与 ImageCell.m // // ImageCell.h / ...

  10. Ogre学习教程:Ogre1.8.1+VS2010环境配置2(转)

    之前按照前面一篇文章提到的部署了ogre1.9,后来查询资料,有的提到关于vs2010还是安装ogre1.8比较稳定,由于是小白,又比对着几篇文章重新配置了一遍. 从一开始的什么都不会,到现在能知道每 ...