本章使用Tibbo DS1004硬件模块搭配RFID实做云林县斗南镇农会的仓储管理系统,DS1004负责收集RFID卷标数据,控制现场灯号状态让操作人员得以判断数据是否被读取,同时将数据送至外部数据库与库存管理系统进行处理。
传统的农业仓储管理,不管是进出货都是由人去点收货物,并将点收后的纸本资料,携带回办公室后,再以的纸本数据作纪录留存与管理,或是将其数据输入至计算机,因此管理不易,并会造成库存数量的误差,且其他操作人员无法容易找寻货物的所在地。有鉴于此,我们使用Tibbo DS1004模块搭配RFID技术,针对云林县斗南镇农会开发出适合其农产品用的仓储管理系统,以期改善上述缺点并有效强化管理效率。
一、系统介绍
系统藉由贴有RFID电子卷标(Tag)之载架(图9.1.1)承载收货后之农作物,并于储存仓库进出处设有无线射频接收器(RFID Reader),(图9.1.2与图9.1.3)以管控农作物之收成箱进出,以追踪生产单位至储存仓库间的生产过程与储存仓库内的农作物进出之时间及储存仓库内的立体空间上之管理。
图9.1.2 RFIDReader实体图
系统原先以Tibbo DS202进行数据撷取与透过网络传送到远程主机的工作,如图9.1.4所示。但因为现场环境非常吵杂,且堆高机运送载架进出速度颇快,操作人员往往无法准确判断是否电子卷标已经被正确读取,因此,改以Tibbo DS1004模块取代DS202,利用其可以进行DO(Digital Output)控制蓝绿灯号,让现场人员可以用目视判断流程是否正确,再利用其Web Server功能,让办公室人员可以透过画面监看进出动态,系统运作图如图9.1.5所示。
二、设备安装与设定
如上所述,需要使用DS1004的串行端口(RS232)数据撷取功能、DO控制功能与Web Server功能来达成目的。这里,我们使用「SB1004」上编号4的位置,如图9.1.6所示。其中的两个接点可以当成RS232接收通讯接口来使用,此处我们要读取RFID卷标ID数据,所以使用的是接点1(commonground)与接点2(RX),如图9.1.6。更多「SB1004」有关讯息请参考下列网址:http://docs.tibbo.com/phm/index.html?ib1004_control.htm。
DO部分我们使用DS1004上的relay1(GPI036)控制红灯与relay2(GPI037)控制绿灯,如表9-1所示,接线方式则如图9.1.7。
外部程序与数据库部分,这里我们使用的是PHP与MySQL,这部分不在本书的讨论范围,读者可以参考市面上相关书籍。
三、系统程序
这里我们建立一个新项目,项目名称为「DMIS」,您可以在本书光盘的CH12目录中找到完整的范例程序,各程序档案与功能说明如表9-2,项目架构如图9.1.8所示。
首先说明main.tbs,on_sys_init事件中做了
(1)设定DS1004模块的IP
(2)启动WebServer功能
(3)启动RS232通讯端口与
(4)设定初始灯号状态(红灯亮,绿灯暗)几件事,
程序代码如下:
include "global.tbh"
sub on sys.init()
'系统启动时,设定设备的IP
dim ip as string
ip="120.109.34.29" '输入您指定的ip位置
set_net_ip(ip) '设定DS10042 IP
html_init '启动VEB SERVER
启动RS232
io.num=PL_I0_NUM_44
io.enabled=YES
io.lineset(PL_I0_NUM_44,LOW)
设定RS232的连线参数
ser.num = 0
ser.baudrate = ser.div9600
ser.interface =PL_SER_SI_FULLDUPLEX
ser.interchardelay = 5
ser.parity = PI_SER_PR_NONE
ser.rxbuf frq(1)
ser.txbuf frq(1)
sys.buffalloc
ser.enabled = YES
'使用两位DO位置(36与37),控制红橙(36)与绿橙(37),起始状态是红橙亮,绿橙暗
io.num=PL_10_NUM_36
io.enabled = YES
io.lineset(PL_IO_NUM_,36,L0U) '红橙亮
io.num=PL_10_NUM_37
io.num=PL_IO_NUM_37
io.enabled=YES
io.enabled=YES
io.lineset(PL_I0_NUM_37,HIGH)'绿橙暗
end sub
再来是main.tbs中on_ser_data_arrival事件,负责获取RFID卷标的ID号码,并切换灯号状态,程序代码如下:
public dim w as word '记录系统时间
public dim rx_data as string 'RFID卡号资料
sub on_ser_data_arrival( )
'当系统通过RS232读取到RFID卡号时,将橙号状态互换
rx_data =""
w=sys.timercount
while ser.rxlen > 0
rx_data = rx_data + ser.getdata(255)
wend
if len(rx_data) >=8 then ' 透过卡号长度判断是否抓取完成
io.lineset(PL_IO_NUM_37,L0W ) ' 绿橙亮
io.lineset(PL_I0_NUM_36,HIGH ) '红橙暗
end if
end sub
最后是main.tbs中on_sys_timer事件,负责当RFID卷标数据被撷取后,将灯号切换回原始状态,程序代码如下:
sub on_sys_timer( )
'2秒后再将橙号状态互换
if sys.timercount-w > 2 then
io.lineset(PL_I0_NUM_36,LOW) '红橙亮
io.lineset(PL_I0_NUM 37,HIGH) '绿橙暗
rx_ data="" '将卡号资料清空
end if
end sub
其次说明fun.tbs,本程序中做了(1)设定IP之子程序、(2)设定网页服务器功能与(3)将程
'设定IP之子程序
sub set_net_ip(s as string(16))
din x,f as byte
s=ddval(s)
'first number can't be 0 or >223
x=asc(left(s,1) )
if x=0 or x>223 then
s=right(s,3)
s=chr(1)+s
end if
'last number can't be 0 or 255
x=asc(right(s,1))
if x=0 or x=255 then
s=left(s,3)+chr(1)
end if
'shut all sockets!
sock.inconenabledmaster = NO
for f=0 to sock.numofsock-1
sock.num= f
sock.discard
while sock.statesimple<>PL_SSTS_CLOSED
wend
next f
'设定IP
net.ip=ddstr(s)
sock.inconenabledmaster=YES
end sub
序内的数据显示到HTML页面之程序,程序代码如下:
'设定网页服务器功能
sub html_init
dim f as byte
'TELNET/HTTP
for f=SOCK_HTTP to SOCK_HTTP+NUM_HTTP_SOCKETS-1
sock.num= f
sock.txbuf frq(HTTP_TX_SZ)
'sock.rxbuf frq(1)
sock.varbuf frq(HTTP_TX_SZ)
sock.redir(PL_REDIR_soCK0+sock.num)
next f
sys.buffalloc
' TELNET/ HTTP
for f=SOCK_HTTP to SOCK_HTTP+NUM_HTTP_SOCKETS-1
sock.num= f
sock.protocol=PI_SOCK_PROTOCOL_TCP
sock.localportlist="23"
sock.httpportlist="80"
sock.connect iontout=40
sock.inconmode= PL_SOCK_INCONMODE_ANY_IP_ANY_PORT
sock.reconmode= PL_SOCK_RECONMODE_ 0
next f
end sub
将程序内的资料演示到HTHL页面
sub sock_setsend(byref s as string )
while sock.txfree< len(s)
if sock.num >= SOCK_HTTP and sock.num<SOCK_HTTP+NUM_HTTP_SOCKETS then .
if sock.statesimple = PL_SSTS_CLOSED then
sock.txclear
exit sub
end if
else
for sock.num = S0CK_HTTP to S0CK_HTTP+NUM_HTTP_SOCKETS-1
sock.close
next sock.num
exit sub
end if
vend
sock.setdata(s)
sock.send
end sub
接着是global.tbh,本引入文件中定义需要的变量与子程序宣告,程序代码如下:
declare sub set_net_ip(s as string(16)) '宣告到程式set_net_ip.
declare sub htnl_init '宣告启动VEB SERVER的子程序
declare sub sock_setsend(byref s as string) '宣告将程式变数演示到WEB介面上的子程序
declare rx_data as string 'RFID卡号
'VEB SERVER需要之变数宣告
CONST NUM HTTP_SOCKETS=3
CONST HTTP_TX_SZ =3
enum_sockets
SOCK_HTTP=3
SOCK_DHCP=15
end enum
最后是网页结构,共包含三个档案,组成方式如图9.1.9所示,采用网页frame的方式设计。
Index.html内容如下:
<?
include "global.tbh"
?>
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
<meta http-equiv="refresh" content="5" />
<title>使用DS1004</title>
</head>
<frameset rows="900,*">
<frame name="header" scrolling="no" noresize target="main" src="content.html">
<frame name="main" src="ToDB.html">
<noframes>
<body>
<p>此网页使用框架,但是您的浏览器不支持框架。</p>
</body>
</noframes>
</frameset>
</html>
content.html内容如下:
<?
include "global . tbh" '载入globa1.tbh设定,主要需要的是rx_data变数
?>
<HTML>
<BODY>
<meta HTTP-EQUIV="Content-Type" CONTENT=" text/html; charset=big5">
<meta http-equiv= "refresh" content="2" /》
目前状态: <br>
<table>
<tr>
<?if rx_data <> ""then?>
<td>
卡号: <FONT COLOR=#0000FF><?sock_setsend(rx_data)?></F0NT>
</td>
<td. bgcolor-#00ff00 width=20>
</td>
<?else?>
<td>请刷卡</td>
<td bgcolor=#ff0000 width=20>
</td>
<?end if?>
</tr>
</table>
</B0DY>
</HTML>
ToDB.html内容如下:
<?
include "global.tbh"
?>
<meta content='2;url=http://1.0.0.1/tibbo/savedb.php?cardid=<?sock_setsend(mid(rx_data,2,8))?>'http-equiv='refresh'>
程序起始执行时状态是红灯亮,绿灯暗,网页画面如图9.1.10所示,如果有撷取到RFIDID,DS1004除了做实际灯号状态切换,也就是红灯暗,绿灯亮,并更改网页状态,如图9.1.11,同时将数据网外传送到外部数据库。
技术支持:司成
联系方式:
seacer@protonmail.com
18538515890@163.com