目录
一、关于上位机
1、上位机与下位机的定义
上位机:
上位机指可以直接发送操作指令的计算机或单片机,一般提供用户操作交互界面并向用户展示反馈数据。
典型设备类型:电脑,手机,平板,面板,触摸屏
下位机:
下位机指直接与机器相连接的计算机或单片机,一般用于接收和反馈上位机的指令,并且根据指令控制机器执行动作以及从机器传感器读取数据。
典型设备类型:PLC,stm32,51,FPGA,ARM等各类可编程芯片
2、上位机与下位机的关系
过程一:上位机给下位机发送控制命令,下位机收到此命令并执行相应的动作。
过程二:上位机给下位机发送状态获取命令,下位机收到此命令后调用传感器测量,然后转化为数字信息反馈给上位机。
过程三:下位机主动发送状态信息或报警信息给上位机。
为了实现以上过程,上位机和下位机都需要单独编程,都需要专门的开发人员在各自两个平台编写代码。
上位机与下位机关系示意图:
3、上位机工作原理
通讯过程
两机如何通讯,一般取决于下位机,TCP/IP一般是支持的,但是下位机一般具有更可靠的独有通讯协议,购买下位机时,会带一大堆手册光盘,告诉你如何使用特有协议通讯,里面会举大量例子,一般对编程人员而言一看也就那么回事,使用一些新的API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节罢了,多语言支持,一般同时支持数种高级语言为上位机编程。
通信协议
通常上位机和下位机通讯可以采用不同的通信协议,可以有RS232的串口通讯或者采用RS485串口通讯。当用计算机和PLC通讯的时候,不但可以采用传统的D形式的串行通讯,还可以采用更适合工业控制的双线的PROFIBUS-DP通讯。采用封装好的程序开发工具就可以实现PLC和上位机的通讯,当然可以自己编写驱动类的接口协议控制上位机和下位机的通讯。
二、项目界面设计过程
1、新建项目
第一步搜索窗体应用,第二步框架记得NFT版本的选择 。
2、form窗体的添加
3、选择添加需要的串口组件
form窗体中设计计算器页面布局,首先在工具箱中添加按键(button)和文本框(TextBox)。
4、计算器界面布局
计算器界面按键可以分为四类:
- 数字按键:0~9
- 运算符:+、-、*、/
- 数值功能:±数值切换,和小数点.
- 结果运算和控制:=:计算表达式的值、CE:清空结果为“0”,Del:删除表达式最后一位。
三、项目代码
1、头文件部分代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
2、主体部分代码
namespace 计算器布局精进版
{
public partial class Form1 : Form
{
#region 方法二:对表达式分析
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.Text += "1";
}
private void button2_Click(object sender, EventArgs e)
{
this.textBox1.Text += "2";
}
private void button3_Click(object sender, EventArgs e)
{
this.textBox1.Text += "3";
}
private void button4_Click(object sender, EventArgs e)
{
this.textBox1.Text += "4";
}
private void button5_Click(object sender, EventArgs e)
{
this.textBox1.Text += "5";
}
private void button6_Click(object sender, EventArgs e)
{
this.textBox1.Text += "6";
}
private void button7_Click(object sender, EventArgs e)
{
this.textBox1.Text += "7";
}
private void button8_Click(object sender, EventArgs e)
{
this.textBox1.Text += "8";
}
private void button9_Click(object sender, EventArgs e)
{
this.textBox1.Text += "9";
}
private void button10_Click(object sender, EventArgs e)
{
this.textBox1.Text += "0";
}
private void button11_Click(object sender, EventArgs e)
{
this.textBox1.Text += "+";
}
private void button12_Click(object sender, EventArgs e)
{
this.textBox1.Text += "-";
}
private void button13_Click(object sender, EventArgs e)
{
this.textBox1.Text += "*";
}
private void button14_Click(object sender, EventArgs e)
{
this.textBox1.Text += "/";
}
private void button15_Click(object sender, EventArgs e)
{
string str = this.textBox1.Text;
double result = (double)Eval_2(str);
this.textBox1.Text = result.ToString();
}
private void button16_Click(object sender, EventArgs e)
{
this.textBox1.Text += "(";
}
private void button17_Click(object sender, EventArgs e)
{
this.textBox1.Text += ")";
}
private void button18_Click(object sender, EventArgs e)
{
this.textBox1.Text += ".";
}
private void button19_Click(object sender, EventArgs e)
{
this.textBox1.Text = "";
}
private void button20_Click(object sender, EventArgs e)
{
if (this.textBox1.Text.Length >0 )
{
this.textBox1.Text = this.textBox1.Text.Substring(0, this.textBox1.Text.Length - 1);
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
}
}
四、项目代码运行
1、按下启动按钮,跳出计算器运行界面。
2、计算器界面运行。
3、等下等号即可算出结果。