论坛首页 | 新人报到 |发帖必看—论坛版规 | 错误报告 | 注册用户
Baidu
发新话题
打印

AB RsLogix5000 PLC第三方模块MVI56的编程开发

本主题由 study 于 2008-10-14 19:45 提升

AB RsLogix5000 PLC第三方模块MVI56的编程开发

AB RsLogix5000 PLC第三方模块MVI56的编程开发!

AB RsLogix5000 PLC第三方模块MVI56的编程开发

在做济钢项目的时候碰到一个很大的挑战,第一济钢要求采用AB的RsLogix5000系列,第二该系统需要联入本公司自己生产的红外测位系统。由于我们的系统的通信协议是内部协议,而AB的PLC不像西门子的200系列的PLC可以对自由口编程,可以很方便的获取到数据,而AB的则不然,目前AB已经不在生产第三方接口的模块,而有其合作的ProSoft公司专门生产第三方模块。ProSoft生产的模块有很多种,由于没有经验,很不幸,我们选择的是MVI56的模块,而这个模块却是全部自由编程,不含有任何默认协议。去退货确要报价的30%作为补偿,八个模块要赔好几万,唉!... ...
      剩下的事,只有研究了,花了五千银子,请了一个“专家”,对AB的产品非常熟。一星期后,终于有点眉目了,原来这个模块就是一个典型的嵌入式系统,相当一个带三个串口的386的电脑,操作系统为小型的DOS系统(TINY DOS),用C++为其开发程序。对DOS C我是非常熟的,可是如何与AB通信确不熟悉,幸好那个“专家”对此比较熟,我们二者一结合,果然成功了--效果出奇的好,不用AB PLC编一行代码,就可以实现把数据写入到变量区。下面是PLC的配置界面:
plc.com/company/UploadPic/2008-4/2008416233832184.gif%26quot; width=563%26gt;
plc.com/company/UploadPic/2008-4/2008416233833398.gif%26quot; width=591%26gt;
//基于 TINY DOS 的C++ 的核心通信程序
//*************************************************************************
//**函 数 名:Com_GetWHData
//**输    入:intAddr  - 红外标尺地址
//**        :intState - 标尺状态 0~9  -1 表示校验错误
//**输    出:无
//**功能描述:获取红外标尺的信息
//**全局变量:
//**调用模块:
//**作    者:叶帆
//**日    期:2004-11-24 16:56:57
//**修 改 人:
//**日    期:
//**版    本:V1.0.0
//*************************************************************************
void Com_GetWHData(WORD *intAddr,WORD *intState)
{
    BYTE ch;
    BYTE bytData[6];
    BYTE bytFlag=0;
    BYTE bytNum=0;
    while(bytNum%26lt;7)
    {
if (MVIsp_Getch(Commport,%26ch,1000) != MVI_SUCCESS)
{
   *intAddr=0;
   *intState=9;
   return;
}
if(bytFlag==1)
{
    bytData[bytNum++]=ch;
}
if(ch==0xAC %26%26 bytNum==0)
{
   bytFlag=1;    //开始接收
}
    }
    //正副本校验
    if(bytData[0]==bytData[1] %26%26 bytData[2]==bytData[3] %26%26 bytData[4]==bytData[5])
    {
//地址信息
*intAddr=(bytData[0]%26gt;%26gt;4)*(WORD)10000+(bytData[0] %26 0x0f)*(WORD)1000+(bytData[2]%26gt;%26gt;4)*(WORD)100+(bytData[2] %26 0x0f)*(WORD)10+(bytData[4]%26gt;%26gt;4);
//状态信息
*intState=(bytData[4] %26 0x0f);
    }
    else
   {
*intAddr=0;
*intState=0xFF;
    }
}

//*************************************************************************
//**函 数 名:ProcessCommand
//**输    入:无
//**输    出:无
//**功能描述:命令处理
//**全局变量:
//**调用模块:
//**作    者:叶帆
//**日    期:2004-11-24 16:56:57
//**修 改 人:
//**日    期:
//**版    本:V1.0.0
//*************************************************************************
int ProcessCommand(void)
{
    WORD intAddr;
    WORD intState;
    WORD intData[2];
    //读取红外标尺信息
    Com_GetWHData (%26intAddr,%26intState);
   //MVIbp_SetUserLED(handle, MVI_LED_USER1, MVI_LED_STATE_OFF);
    //读取背板数据(注重,AB PLC在配置模块时,输出缓冲区的大小必须为0)
    if (MVI_SUCCESS == MVIbp_ReadOutputImage(handle, intData, 0, 2))
    {
     //数据改变或有效才写入数据
     if (intState!=0xFF %26%26 (intData[0]!=intAddr ||intData[1]!=intState))
     {
        intData[0]=intAddr;
        intData[1]=intState;
        if (MVI_SUCCESS !=  MVIbp_WriteInputImage(handle,intData, 0, 2))
        {
     return(0);     //原来为1,现改为0  2005年6月8日
        }
        //MVIbp_SetUserLED(handle, MVI_LED_USER1, MVI_LED_STATE_ON);
     }
    }
    return(0);
}
------------------------------------------------------------
目前我敢说,只要还是基于这种模块,只要知道协议,我就可以实现AB PLC与第三方模块的通信。其实我也这样做了,我用业余时间已经实现了 Modbus Rtu协议,实际测试后,效果不错!

TOP

佩服楼主的技术啊……学习学习!

TOP

发新话题
郑重声明: 本论坛属技术交流,非赢利性论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,会员在论坛发表的言论仅代表个人观点,不代表论坛立场!
本站部分内容及所有资料来自网络,版权归原作者所有,本站仅仅提供一个观摩学习的环境,将不对任何资源负法律责任!请在下载后24小时内删除!
会员出于学习和科研的目的进行交流和讨论,如有侵犯原作者的权益,请来信告知,我们将立即删除,并将删除结果给予答复,如有版权争议请与yhlbbs@126.com联系!