摘要:PLC以其固有的特性,在閘閥門智能化處理中得到了廣泛的應(yīng)用。解決好PLC與閘閥門開度檢測裝置間的數(shù)據(jù)傳輸接口是實(shí)現(xiàn)閘閥門高效、可靠、安全運(yùn)行的關(guān)鍵。雖然,PLC提供SSI輸入模塊,但這類模塊價(jià)格太高,需要配置專用電纜和處理軟件。利用單片機(jī)實(shí)現(xiàn)與閘閥門開度檢測裝置(SSI)的輸入接口,實(shí)現(xiàn)串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)與PLC數(shù)值量輸入模塊連接的輸出接口。這樣既降低了成本,又簡化了PLC的編程。
關(guān)鍵詞:單片機(jī) 閘閥門 檢測方法
閘閥門開度檢測裝置在淮安三線船閘工程中,是實(shí)現(xiàn)閘閥門安全、高效和智能化運(yùn)行的主要設(shè)備之一。該檢測裝置運(yùn)用主要目的為:
(1)在閘閥門啟閉操作時(shí),用于實(shí)時(shí)指示閘閥門的開度位置,以利于操作員及時(shí)掌握閘閥門的運(yùn)行情況;
(2)閘閥門開度參與閘閥門的運(yùn)行控制,如使閥門開啟至任意設(shè)定開度,實(shí)時(shí)監(jiān)視閥門在這一設(shè)定開度時(shí)的下滑情況,并根據(jù)閥門下滑至不同關(guān)鍵位置時(shí),立即采取相應(yīng)的處理措施。
(3)控制左右人字閘門同步運(yùn)行與平穩(wěn)變速運(yùn)行。
ROQ425是德國海德漢(HENDENHAIN)的(13位+12位)絕對編碼器。特別適合于高精度、大量程閘閥門行程測量和控制的場合,是構(gòu)成閘閥門檢測裝置的主要部件。具有如下主要特點(diǎn):
(1)分辨率高,最高可達(dá)8192線/轉(zhuǎn)(13位);
(2)量程大,最高可達(dá)4096轉(zhuǎn)(12位);
(3)掉電位置保護(hù),無論開度儀掉電多少時(shí)間,系統(tǒng)上電后,ROQ425總能準(zhǔn)確地測量出閘門當(dāng)前的開度。
(4)數(shù)據(jù)輸出接口,采用串行同步接口(SSI)傳輸數(shù)據(jù)。
PLC以其固有的特性,在閘閥門智能化處理中得到了廣泛的應(yīng)用。解決好PLC與閘閥門開度檢測裝置間的數(shù)據(jù)傳輸接口是實(shí)現(xiàn)閘閥門高效、可靠、安全運(yùn)行的關(guān)鍵。雖然,PLC提供SSI輸入模塊,但這類模塊價(jià)格太高,需要配置專用電纜和處理軟件。利用單片機(jī)實(shí)現(xiàn)與閘閥門開度檢測裝置(SSI)的輸入接口,實(shí)現(xiàn)串行數(shù)據(jù)轉(zhuǎn)換成并行數(shù)據(jù)與PLC數(shù)值量輸入模塊連接的輸出接口。這樣既降低了成本,又簡化了PLC的編程。
硬件設(shè)計(jì)方案主要實(shí)現(xiàn)
(1)與ROQ425的SSI連接;
(2)與PLC模擬量輸入模塊和MODBUS口的連接;
(3)完成輸入串行數(shù)據(jù)(ROQ425 SSI)到輸出4-20mA的轉(zhuǎn)換。
(4)完成輸入串行數(shù)據(jù)(ROQ425 SSI)通過MODBUS口輸出到PLC
1.1 ROQ425 SSI接口介紹
ROQ425 SSI接口電壓為5V±5%,空載時(shí)最大電流功耗為250mA。采用差分SN65LBC176線接收/驅(qū)動(dòng)器進(jìn)行數(shù)據(jù)傳輸,最遠(yuǎn)傳輸距離可達(dá)100m。ROQ425內(nèi)部接口見圖1。
ROQ425是多圈絕對型旋轉(zhuǎn)編碼器,每圈用13位表示精度,用12位記錄圈數(shù)。因此,開度絕對位置值采用25位字長表示。數(shù)據(jù)發(fā)送時(shí)序關(guān)系見圖2,其工作原理為:
1.2 硬件工作原理
硬件設(shè)計(jì)由SSI接口、I/O接口、單片機(jī)和電源四部分組成。
(1)SSI接口選用ROQ425推薦的RS422接口芯片MAX488。
(2)I/O接口采用光電耦合器隔離,DA模塊采用AD7541和AD694。MODBUS接口模塊采用MAX232E。
(3)單片機(jī)選用高性能的AT89C51(單字長指令、定時(shí)/計(jì)數(shù)器、看門狗)
(4)選用24VDC輸入5VDC輸出和24VDC輸入15VDC輸出的DC/DC模塊電源。
原理圖如下
通過對AT89C51進(jìn)行編程,達(dá)到實(shí)時(shí)將SSI接口數(shù)據(jù)轉(zhuǎn)換成4-20輸出或通過MODBUS口傳送至PLC系統(tǒng)的目的。主要流程如下:
下面是AT89C51的部分源程序:
#include <reg51.h>
#include <stdio.h> /* define I/O functions */
#include <absacc.h> /* define absacc functions */
#include <STDLIB.h> /* define absacc functions */
#include <intrins.h> /*#define uchar unsigned char*/
#define _Nop() _nop_()
typedef unsigned int word;
typedef unsigned char byte;
typedef unsigned long dword;
static word data da,db,dc,df,p,crc1,cir,high;
static dword data da1,db1,dc1,df1,dd,de,max,zero,zero2,dcb;
static byte data show[7],show1[4],show2[4],sendm[8],s[4],bb[4];
static byte data dd1,watch,kk,t[1],dd2[1];
code byte disp[16]={0x77,0x41,0x3b,0x6b,0x4d,0x6e,0x7e,0x43,0x7f,0x6f,0x5f,0x7c,0x36,0x79,0x3e,0x1e};
void readgray();/*讀取ROQ425數(shù)據(jù)*/
void delay();
void i_start();
void i_stop();
void i_init();
void i_send(byte);
void display();
void change(dword);
void change1(dword);
void setzero();
void zero1();
void nub();
void addr();
void cir1();
void e_start();
void e_stop();
void e_send(byte);
byte e_recevie();
void e_ack(bit);
void e_send1(dword);
bit isend(byte,byte,byte *,byte);
bit ireceive(byte,byte,byte *,byte);
void watchdog();
void one();
void two();
void three();
void one1();
void two1();
void three1();
void pos();
void res();
void comsend(byte);
word crc16(byte *);
byte shj();
void main()
{
register i,j,k,x;
bit d;
dcb=0;
show[0]=0x70;
show[1]=0x00;
show[2]=0x27;
display();
for (i=0;i<4;i++)
{
show1[i]=0;
show2[i]=0;
}
SCON=0xc8;/*采用方式3 */
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET1=0;
ES=0;
EA=0;
high=0x07;
max=8000;
dd1=0;
sda1=1;
delay();
sda1=0;
dd2[0]=0;
while(1)
{
for (j=0;j<4;j++)
{
for (x=0;x<8;x++)
{
zero2*=2;
z=(bit)(show2[j]&0x80);
if (z==1)
zero2++;
show2[j]=show2[j]<<1;
}
}
zero=zero2;
p=0;
watchdog();
txd=1;
readgray();
watchdog();
dd=da & 0x0fff;
de=db & 0x1fff;
dc1=dd*8192+de;
P0=dc1 & 0x000000ff;//(dc1 & 0x000001fe)>>1;
P2=(dc1 & 0x00000f00)>>8;//(dc1 & 0x00001e00)>>9;
if(t[0]==1)
{
if((zero>=0)&&(zero<=10000000))
one();
else
if((zero>10000000)&&(zero<=33390591))
two();
else
three();
}
else
{
if((zero>=0)&&(zero<=10000000))
one1();
else
if((zero>10000000)&&(zero<=33390591))
two1();
else
three1();
}
sendm[0]=0x06;
sendm[1]=0x06;
sendm[2]=0x00;
sendm[3]=0x05;
sendm[4]=dc1/256;
sendm[5]=dc1%256;
crc1=crc16(sendm);
sendm[6]=crc1 / 256;
sendm[7]=crc1 & 0xff;
rd=1;
for(i=0;i<8;i++)
{
ACC=sendm[i];
TB8=par;
comsend(sendm[i]);
}
watchdog();
display();
}//end while
}//end main
采用上述方法實(shí)現(xiàn)PLC與閘閥門開度檢測裝置之間的連接。不僅具有成本低、PLC編程簡單的特點(diǎn),而且具有高可靠性。