温室监控系统上位机程序设计

目录

一、项目要求

1、基本要求

3、设计“通风”、“采光”、“喷灌”、"退出系统"等按钮,按钮功能如下:

二、任务实施

2、设计温室监控系统应用程序界面

3、上位机与下位机通信协议定制

三、编写程序

1.定义帧格式变量

3.定义数据发送事件

3.1温室控制系统程序实现

四、程序调试


一、项目要求

1、基本要求

1、显示与下位机通信的串行端口号,具有自动扫描可用串口端口号、打开/关闭串口的功能。

2、具有实时显示当前环境温度值(保留1位小数)的功能。

3、设计“通风”、“采光”、“喷灌”、"退出系统"等按钮,按钮功能如下:

(1)点击“通风”按钮,按钮文本切换为“停止通风”,并发送控制命令给下位机,打开通风设备;再次点击该按钮,按钮文本切换为“通风”,并发送控制命令给下位机,关闭通风设备。

(通风设备的“打开/关不”,由直流电动机的“启动转动/停止转动”来模拟)。

(2)点击“采光”按钮,按钮文本切换为“停止采光”,并发送控制命令给下位机,打开采光设备;再次点击该按钮,按钮文本切换为“采光”,并发送控制命令给下位机,关闭采光设备。

(采光设备的“打开/关闭”,由LED灯的“点亮/熄灭”来模拟)。

(3)点击“喷灌”按钮,按钮文本切换为“停止喷灌”,并发送控制命令给下位机,打开喷灌设备;再次点击该按钮,按钮文本切换为“喷灌”,并发送控制命令给下位机,关闭喷灌设备。

(喷灌设备的“打开/关闭”,由直流电动机的“启动转动/停止转动”来模拟)、

(4)点击“退出系统”按钮,弹出下图所示“确认”信息框,实现功能如下:点击“是”退出应用程序,点击“否”返回应用程序。

4、应用程序下方,显示“开发环境”、“运行环境”等信息,以及串口端口“打开”和“关闭”状态栏。

二、任务实施

2、设计温室监控系统应用程序界面

打开Visual Studio 2019 编程环境,创建一个名称为“温室控制系统设计”的项目,设计一个“温室控制系统”应用程序功能界面,该程序可以使用项目上位机程序模板进行修改,可以加快开发速度,如下图所示

3、上位机与下位机通信协议定制

如下图所示,本项目中上位机与下位机是通过串口连接进行数据传输的,上位机可以控制温室大棚进行通风、采光等操作,这种操作属于上位机下发控制指令,数据流向从上到下;上位机还需要显示当前温室大棚内的实时温度值,这种属于下位机上传数据,数据流向诗词上下到上。

三、编写程序

1.定义帧格式变量

const byte FRAME_HEAD1 =OXAA;
const byte FRAME_HEAD2 = 0x55;
const byte FRAME_END =OxOD;
ConSt byte FRAME_DIR_CMD=0x01;
const byte FRAME_DIR_REC =0x81;
//帧头1
//帧头2
//帧尾
//数据方向
上位机发命令
//数据方向
上位机接收数据
6
3e
C
const byte DEVICE_LED = 0x01;
const byte DEVICE_FAN =0x02;
const byte DEVICE_TEMP=0x03:
//设备类型
LED
//设备类型
风扇
//设备类型
温度传感器

2.实现串口 数据解析功能

2
public void ReceivedRawData(bytel]data)
M
i0
Cn
2
foreach(byte bl in data) //遍历字节数组,逐个字节进行处理
switch(pharse_state)
case 0:
if(b1 == FRAME_HEAD1)
//如果是第1个帧头,则下一步
pharse_state =1;
break;
case 1:
993日9日998寸メNさXRRR
1卡(b1 FRAME HEAD2)
//如果是第2个帧头,则下一步
pharse_state=2;
else
pharse_state=0;//如果不是,则返回初始状态
break ;
case 2:
if(b1 == FRAME_DIR_REC)//如果是下位机返回的数据,则下一步
pharse_state =3:
data_object.Clear();//清除有效数据缓冲,为接收数据做准备
else
pharse_state=0;
//如果不是,则返回初始状态
break ;
case 3:
data_object.Add(b1);
//接收有效数据
if(data_object.count >= 3)//接收3个有效数据后下一步
Dnarse state
break ;
case 4:
8高出品品出男导
if(b1 = FRAME_END)
//如果是惊尾,则证明这一帧数据正常
PhrasevalidData(data_object);
pharse_state =0;
//进一步解析有效数据
//返回初始状态
else
pharse_state=0;
break ;
//返回初始状态
45
46
47
AB
A9
50
private void phrasevalidpata(List<byte> data ist)
switch(data_ist[0])
CaSe DEVICE_TEMP:
temperaturedata list[1]*65535 + data_list[2];
break;

3.定义数据发送事件

//声明一个委托类型,用来发送数据
public delegate void sendData(byte[] data);
//定义一个事件,发生该事件时需要将原始数据发送
2
public event sendpata Requestsendata:

4.实现风扇控制接口

A
public void setFanstate(uInt16 run_time)
M
4
L~
6
8
10
byte[] data =new byte[7]; //新建数组
data[0]= FRAME_HEAD1;
//帧头1
//顿头2
data[1]= FRAME_HEAD2 ;
data[2]-FRAME_DIR_CMD;
//数据传输方向,上位机下发指令
//控制对象 风扇
data[3]= DEVICE_FAN;
data[4]=(byte)((run_time >>8)&0xFF);
data[5]=(byte)(run_time & OxFF);
data[6]= FRAME_END;
if(Requestsendpata !=nu11)
//高位在前
//低位在后
//帧尾
//如果有事件订阅
RequestsendData(data);
13

5、实现灯光控制接口

public void setLedstate(uInt16 run_time)
byte[] data=new byte[7];
data[O]= FRAME_HEAD1;
dataT1]= FRAME_HEAD2 ;
data[2]=FRAME_DIR_CMD;
data[3]= DEVICE_LED;
data[4]=(byte)((run_time >>8)& 0xFF);
data[5]=(byte)(run_time & 0xFF);
10
11
12
13
data[6]= FRAME_END;
if(Requestsendpata != nu11)
RequestsendData(data);

6、实现温度读取接口

Semaphore
sema = new semaphore(0
public int ReadTemperature()
Po
Cn
10
11
NM
14
3 合
18
19
byte[l data=new byte[7];
data[0]= FRAME_HEAD1;
data[1]= FRAME_HEAD2 ;
data[2]=FRAME _DIR_CMD;
data[3]- DEVICE TEMP;
data[4]-0;
data[5]=0;
data[6]= FRAME_END;
if(RequestsendData != nu11)
Requestsendpata(data);
if(sema.waitone(500))//等待500ms,如果接收到了温度数据则立即往下执行并返回
true,如果超过500ms仍然未接收到温度数据也会往下执行并返回fa1se
return temperature;
else
return 0;

3.1温室控制系统程序实现

实例化一个GrenHouse类,并在窗体的构造函数中订阅RequestSendData事件,在RequestSendData事件发生时,需要将实参的byte数据通过串口发送。代码如下

从串口接收到数据后,将数据通过RequestSendData方法传给GrenHouse模块,代码如下:

通风、采光、读取温度的按键功能代码实现如下:

四、程序调试

运行上位机程序并打开COM1,运行串口助手并打开COM2,如图所示

在上位机程序中,观察串口调试工具是否收到了数据,并观察数据格式是否正常

当我们看到输出窗口输出了 “temperature=256”,表明上位机收到并成功解析了数据

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值