你的位置:首页 > 技术支持 > 相关资料    技术咨询:15359322692(乐工)

流量计检定装置中流量变化的自动控制

2016-3-16 9:33:14      点击:
流量计检定装置中流量变化的自动控制
  

摘 要:文章介绍了流量计检测设备中的主要流量控制方面的核心问题及解决方法。在硬件方面简要介绍了计算机与变频器的连接,在软件方面利用VC++通信控件MSComm编制上位机软件并且提供了详细的程式和实际中遇到的问题及解决方法。软件和硬件利用RS-485通讯有机结合良好地实现了工程的目的。

关键字:MSComm控件 变频器 流量控制



    流量计生产厂家在生产仪表和校验仪表的时候就需要对这些仪表的参数进行检定,确定仪表的性质并提供给使用者相应的参数以便于使用。确定仪表参数有很多种方法,在实流检定方法中检测装置必须提供相应仪表流量范围内的几个检测点的流量。下面就阐述一下检测装置的几个检测点流量变化的实现。

    1 工程要求及实现方法

    工程中提供信号采集器、标准表、相应口径管道、变频器和风机等设备。为了实现对整个标定过程的全自动的控制, 我们利用VC++通信控件MSComm编制上位机软件对变频器进行控制,变频器再对风机进行频率控制,从而控制风机的输出功率达到气体流量的变化。

    2 系统设计与实现

    在本系统中硬件连接是从计算机的RS-232接口通过RS-232/485转换器连接到变频器。系统采用的是ABB公司的ACS400变频器,在VC++编制通讯软件的时候通讯协议严格按照ACS400变频器的通讯协议进行编写。系统硬件连接图如下:

    实现流量自动控制的思路有两种,一是给出流量的控制信号,经过变频器动作之后,再由实际的流量传感器获得流量值传给主控计算机,由主控计算机进行比较运算得出进一步的调整信号再发给变频器,变频器动作后流量进一步接近设定值;这样特定算法反复几次后便达到设定值(如图1)。二是通过实际试验得出的准确经验值,设定到计算机里面,通过经验值进行控制也会达到预期目的。在这里采用第二种方法,由于通过经验值的方法,控制方式简单,实现速度快,完全满足工程要求的控制精度。

    2.1 MSComm控件[1]

    VC++编写串口通讯的方法很多,其中利用MSComm(Microsoft Communications Contro1)控件编程非常简单方便,它是微软公司开发的专用通信控件,封装了串口的所有功能,我们只用其中主要的通信功能就能完成工程需要。

    2.2 串口设置

    定义串口控件的对象为m_com。
    设置变频器通信格式:
    通信设置:2400,n,8,2
    波特率:2400;无奇偶校验位; 8个数据位,2个停止位
    帧的包装格式:起始位1+数据位8+停止位2=11位
    串口初始化为:
    if(m_com.GetPortOpen())//如果串口打开则关闭
        m_com.SetPortOpen(FALSE);
    m_com.SetCommPort(1);//选择COM1
    m_com.SetInBufferSize(1024);
    //设置输人缓冲区的大小1024Bytes
    m_com.SetOutBufferSize(1024);
    //设置输人缓冲区的大小1024Bytes
    m_com.SetRThreshold(1);
    //表示有一个字符引发一个事件
    m_com.SetInputMode(1);
    //表示为二进制输入
    m_com.SetSettings("2400,n,8,2");
    if(!m_com.GetPortOpen())
    //打开串口
    m_com.SetPortOpen(TRUE);
    m_ReceiveData="";
    //接收通信数据的缓冲变量清零

    2.3 发送数据

    在发送命令的时候严格按照变频器的协议进行编制;由于通常发送命令都是按照字符串的形式发送但是该控件的发送是VARIANT类型,所以应用关键是解决VARIANT与字符串之间的转换问题,包括我们在串口响应得到的数据的关键也是如此,详见2.4节。下面的函数会说明字符串到VARIANT的转换过程。

    变频器通讯数据包格式为:

开始
地址域
功能域
数据域
CRC校验
结束
 
8位
8位
n*8位
16位
 
 
××
××
××……××
××××
  

    开始:忽略。
    结束:忽略。
    地址域:0~247,0是广播式的传播,正常传递的时候返回值也会在地址域写上自己的站号。
    功能域:0x03读操作,Ox06写操作,响应返回如果正常则值相同否则返回0x83且在数据域说明原因。
    数据域:具体操作值。
    CRC校验:CRC域位于信息的最后,低字节在前,高字节居后。在传送信息的时候最后发送低字节。

    把需要发送的命令以字符串的形式赋给m_SendData程序如下:

    CByteArrav hexdata;//十六进制的数据
    b_String2Hex(m_SendData,hexdata);
    //把字符串转化成十六进制并添加上CRC校验位
    m_com.SetOutput(COleVariant(hexdata));
    //发送数据
    //功能:把字符串转化成十六进制并添加上CRC校验位
    int CQBView:: b_String2Hex(CString str,
    CByteArray &senddata)
    {
        int hexdata,lowhexdata;
        int hexdatalen=0;
        int len=str.GetLength();
        BYTE a[200];
        BYTE A,B;
        WORD C,D;
        A=0xFF;
        B=0xFF;
        CString yang;
        CString shan;
        senddata.SetSize(1en/2+8);
    for(int i=0;i<len;)
    {
        char lstr,hstr=str[i];
        if(hstr=='')
    {
        i++;continue;
    }
    i++;
    if(i>=len)
        break;
        lstr=str[i];
        hexdata=ConvertHexChar(hstr);
        //该函数是把字符转成十六进制
        lowhexdata=ConvertHexChar(1str);
    if((hexdata==16)||(1owhexdata==16))
    break;
    else
        hexdata=hexdata*16+lowhexdata;
        i++;
        a[hexdatalen]=hexdata;
        hexdatalen++:
    }
    //CRC_16校验的算法
    for(i=0;i<hexdatlen;i++)
    {
        B=B^a[i];
        C=A*256+B;
        for(int j=0;j<8;j++)
    }
        D=C&Ox0001;
        C=C≥1;
        if(D)C=C^0xA001;
    }
        A=C/256:
        B=C%256;
    }
    a[i]=B;
    a[i+1]=A;
    hexdatalen=hexdatalen+2;
    for(i=0;i<hexdatalen;i++)
    {
        senddata[i]=(char)a[i];/* */
        shan.Format("%.2x",a[i]);
        yang+=shan;
    }
        yang.MakeUpper();
        senddata.SetSize(hexdatalen);
        return hexdatalen;
    }

    2.4 接收数据处理

    接收数据要用到串口响应的函数OnOnCommMscomm1(),该函数时刻响应串口的动作,真正从缓冲区中得到正确数据,有两个难点:一是解决VARIANT转换为字符串类型,二是解决过滤掉不正确的信息。第一个问题的解决方式比较固定,如下例程,过程是VARIANT转换为ColeSafeArray型变量再转换为BYTE型数组再到CString型变量;而第二个问题的解决方式比较麻烦,因为每个字符都会引起OnOnCommMscomm1()的响应,所以一串完整的信息,往往要执行很多次OnOnCommMscomml()事件,如果在该函数中进行处理数据,那么不固定很难操控并且处理完的数据缓冲变量必须清空。所以为了解决这一问题笔者设了一个定时器,当信息串的第一个字符引起响应的时候设置定时器并用一个标志封住防止重复设置定时器,这样设置一个很短的一个时间后在数据缓冲变量中累计的就是一个完整的信息串。为了验证该信息串的正确性可以验证该CRC校验位,但是在这里为了方便理解,在定时函数中判断该长度就够了,判断正确后再按照通信协议进行提取并处理信息。同时在定时器的函数里销毁定时器并且解除对设置定时器的封存,为接收下一信息串作准备。

    例程如下:

    void CQBView:: OnOnCommMscomml()//串口响应函数
    {
        // TODO: Add your control notification handler code here
        //功能:把接收来的数据转换成字符串的形式
        VARIANT m_input1; ColeSafeArray m_input2;LONG length, i;
        BYTE data [1024];CString str;
        if(m_com.GetCommEvent()== 2)
        //响应事件为2
        {
        m_input1=m_com.GetInput();
        //读取缓冲区内的数据
        m_input2=m_input1;
        //将VARIANT型变量转换为ColeSafeArrav型变量
        length=m_input2.GetOneDimSize();
        //确定数据长度
        for(i=0;i<length;i++)
        //将数据转换为BYTE型数组
        m_input2.GetElement(&i,data+i);
        for(i=0;i<length;i++)
        //将数组转换为CString型变量
        {
            char a=* (char*)(data+i);
            str.Format("%02x",a);
            str=str.Right(2);//取最后三位
            m_ReceiveData+=str;
        }
        m_ReceiveData.MakeUpper();//变大写
    {
        if(b_yangweishan)
    {
            SetTimer(1,100,NULL);//延时读取
            b_yangweishan=FALSE;
            //保证一串信息响应一次
        }
    }
    void CQBView::OnTimer(UINT nlDEvent)
        //定时函数
    {
        // TODO: Add your message handler code here and/or call default
        KillTimer(1);//销毁定时器
        b_yangweishan=TRUE;//解除封锁
        if(m_ReceiveData.GetLength()==12)
        //简单验证
        {
    //工作区开始
            Operationl(m_ReceiveData);
            //提取数据
            Operation2();//计算操作1
            Operation3();//计算操作2
            Show();//数据显示
    //工作区结束
            m_ReceiveData.Empty();//数据缓冲
    变量清空
    }
    else//不正确的信息
        {
            m_ReceiveData.Empty();
        }
    }

    3 应用总结

    根据不同的通信形式和通信协议通过串口进行数据通信,形式大都很类似,上面与变频器的通信的方法完全可以衍生到PC机与单片机、PLC、Modem等智能设备的通信。对于MSComm控件的属性还很多,在这里只提到几项主要的设置,对串口的操作MSComm完全可以胜任,而且屏蔽掉了底层函数的编写为程序员省了很多时间,且该控件并不局限于CFormView和CDialog类里面应用,它完全可以在一般的框架里面应用,只是把绑定方式复杂些。笔者利用MSComm控件开发的全自动式标准表法气体流量标定系统运行稳定可靠,并且整体的性价比比较好,在标定过程当中相对时间短、运行成本低,对生产效率和效益起到很大的积极作用。

友情提醒:购买流量计,请您拨打全国统一服务热线400-0592-364,选型请提供管道口径、介质常用温度、介质压力、流量范围、介质名称,输出信号等流量计的技术参数和要求。了解流量计品牌、详细信息、产品价格、使用说明,敬请详细阅读本网页。