第九章、DS1004实作斗南镇农会库存系统范例

本章使用Tibbo DS1004硬件模块搭配RFID实做云林县斗南镇农会的仓储管理系统,DS1004负责收集RFID卷标数据,控制现场灯号状态让操作人员得以判断数据是否被读取,同时将数据送至外部数据库与库存管理系统进行处理。

传统的农业仓储管理,不管是进出货都是由人去点收货物,并将点收后的纸本资料,携带回办公室后,再以的纸本数据作纪录留存与管理,或是将其数据输入至计算机,因此管理不易,并会造成库存数量的误差,且其他操作人员无法容易找寻货物的所在地。有鉴于此,我们使用Tibbo DS1004模块搭配RFID技术,针对云林县斗南镇农会开发出适合其农产品用的仓储管理系统,以期改善上述缺点并有效强化管理效率。

一、系统介绍
系统藉由贴有RFID电子卷标(Tag)之载架(图9.1.1)承载收货后之农作物,并于储存仓库进出处设有无线射频接收器(RFID Reader),(图9.1.2与图9.1.3)以管控农作物之收成箱进出,以追踪生产单位至储存仓库间的生产过程与储存仓库内的农作物进出之时间及储存仓库内的立体空间上之管理。
在这里插入图片描述

图9.1.1、贴有RFID电子卷标(Tag)之载架

在这里插入图片描述


图9.1.2 RFIDReader实体图

在这里插入图片描述

图9.1.3 仓储场进出口两端之RFIDReader实体图

系统原先以Tibbo DS202进行数据撷取与透过网络传送到远程主机的工作,如图9.1.4所示。但因为现场环境非常吵杂,且堆高机运送载架进出速度颇快,操作人员往往无法准确判断是否电子卷标已经被正确读取,因此,改以Tibbo DS1004模块取代DS202,利用其可以进行DO(Digital Output)控制蓝绿灯号,让现场人员可以用目视判断流程是否正确,再利用其Web Server功能,让办公室人员可以透过画面监看进出动态,系统运作图如图9.1.5所示。
在这里插入图片描述

图9.1.4、DS202+RFID Reader实体图

图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。
在这里插入图片描述

图9.1.6 DS1004接线图

DO部分我们使用DS1004上的relay1(GPI036)控制红灯与relay2(GPI037)控制绿灯,如表9-1所示,接线方式则如图9.1.7。

表9-1、DS1004上的Control Lines控制编号表
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200909161728277.png#pic_center)

在这里插入图片描述

图9.1.7 DS1004上DO接线图

外部程序与数据库部分,这里我们使用的是PHP与MySQL,这部分不在本书的讨论范围,读者可以参考市面上相关书籍。

三、系统程序
这里我们建立一个新项目,项目名称为「DMIS」,您可以在本书光盘的CH12目录中找到完整的范例程序,各程序档案与功能说明如表9-2,项目架构如图9.1.8所示。

表9-2、DMIS项目程序档案与功能说明

在这里插入图片描述
在这里插入图片描述

图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的方式设计。
在这里插入图片描述

图9.1.9 网页结构图

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,同时将数据网外传送到外部数据库。
图9.1.10 程序初始网页画面

图9.1.10 程序初始网页画面

图9.1.11 程序撷取到RFID ID网页画面

图9.1.11 程序撷取到RFID ID网页画面

技术支持:司成
联系方式:
seacer@protonmail.com
18538515890@163.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值