上位机与下位机进行交互

一、上位机与下位机

(1)、什么是上位机?

               上位机是指可以直接发出操控命令的计算机 这里使用的是winfrom

(2)、什么是下位机?

               下位机是指直接控制设备获取状况的计算机,一般是PLC/ 单片机

(3)、上位机与下位机的通讯

                使用串口(RS232)进行通讯,在winfrom中可以使用seriaPort控件实现通讯对下位机进行操作。在进行通讯前需要连接串口、通过SerialPort.GetPortNames()方法获取串口名称,控件名.Open() 用来打开串口。

            String[] Ports = SerialPort.GetPortNames(); //获得端口名称

			comProt.Items.Add("请选择串口");             //设置第一个选项
			comProt.Items.AddRange(Ports);              //将串口加入到下拉框
			comProt.SelectedIndex = 0;                  //默认显示第一个

二、上位机读取下位机数据进行展示

 (1)、需要连接对应的串口,订阅连接串口的点击事件

		private void button1_Click(object sender, EventArgs e)
		{
			if (comProt.SelectedIndex == 0)
			{
				MessageBox.Show("请先选择正确的串口");
				return;
			}
			//获得串口名称
			if (!serialPort.IsOpen)
				serialPort.PortName = this.Ports[comProt.SelectedIndex - 1];
			//判断串口是否打开 打开默认为true
			if (serialPort.IsOpen)
			{
				try
				{
					serialPort.Close();
					button1.Text = "打开串口";
					button1.BackColor = Color.Green;
				}
				catch
				{
					serialPort.Close();
					MessageBox.Show("端口出错了", "提示");
				}
			}
			else
			{
				//当端口关闭时打开
				try
				{
					serialPort.Open();
					button1.Text = "关闭串口";
					button1.BackColor = Color.Red;
				}
				catch
				{
					serialPort.Close();
					MessageBox.Show("端口出错了", "提示");
				}
			}
		}

(2)、点击获取参数,订阅点击事件

    需要定义一个集合、里面放入操作数:并对数组进行循环

		private void button2_Click(object sender, EventArgs e)
		{
			if (serialPort.IsOpen)
			{
				//设置默认值
				UInt16 _rx_axis_num;
				UInt16 _rx_register_name;
				int rx_tmpDataint;
				float rx_fTemp;
				//对操作命令数组进行循环
				foreach (UInt16 item in cmd_of_info_to_update)
				{
					//对串口进行写入操作
					SerialWriteData(1, 1, item, 0);
					//睡眠30毫秒 确保数据写入完毕
					Thread.Sleep(30);
					//当串口字节数等于8时 说明写入成功
					if (serialPort.BytesToRead == 8)
					{
						//将串口数据写入puff中
						serialPort.Read(puff, 0, 8);
						if (ConvertRxBytesToCmd(puff, out _rx_axis_num, out _rx_register_name, out rx_tmpDataint, out rx_fTemp))
						{
							ProcessReceivedData(_rx_axis_num, _rx_register_name, rx_tmpDataint, rx_fTemp);
						}
					}
				}
			}
			else
			{
				MessageBox.Show("请先打开串口");
				return;
			}
		}

对串口进行写入的函数 SerialWriteData

		/// <summary>
		/// 对串口进行写入
		/// </summary>
		/// <param name="_rw">默认为1是读 0是写 固定的两个值</param>
		/// <param name="_axis_num">从站地址 默认为1 默认为1写死的</param>
		/// <param name="_cmd">功能号</param>
		/// <param name="cmdValue">写入的数据 可以是0</param>
		void SerialWriteData(UInt16 _rw, UInt16 _axis_num, UInt16 _cmd, int cmdValue)
		{
			//定义一个缓存串口写入的8个字节数据
			byte[] buffer = new byte[8];
			//也是一个缓存 用来存放数据
			byte[] value = new byte[4];
			//将数据放入value中
			value = BitConverter.GetBytes(cmdValue);

			UInt16 tmpRWcmd = 0x8000;
			tmpRWcmd = (UInt16)(tmpRWcmd | (_rw << 12));   //RW 判断读写
			tmpRWcmd = (UInt16)(tmpRWcmd | (_cmd & 0x0FFF));    //

			buffer[0] = 0;
			buffer[1] = (byte)_axis_num;       //从站地址1
			buffer[2] = (byte)(tmpRWcmd >> 8);//tmpRWcmdByte[1];    //首位读写位
			buffer[3] = (byte)(tmpRWcmd & 0xFF);    //剩余15位 寄存器位
			buffer[4] = value[3];           //数据最高位
			buffer[5] = value[2];
			buffer[6] = value[1];
			buffer[7] = value[0];           //数据最低位

			if (serialPort.IsOpen)
			{
				//将缓存中的数据写入串口中
				serialPort.Write(buffer, 0, 8);
				Thread.Sleep(20);
			}
			else
			{
				MessageBox.Show("串口未打开");
				return;
			}
		}

 处理数据

		/// <summary>
		/// 对数据进行处理
		/// </summary>
		/// <param name="_serialData">要处理的缓存数据</param>
		/// <param name="_axis_num">从站地址1</param>
		/// <param name="_register_name">控件名</param>
		/// <param name="tmpDataint">整型</param>
		/// <param name="fTemp">浮点型</param>
		/// <returns></returns>
		bool ConvertRxBytesToCmd(byte[] _serialData, out UInt16 _axis_num, out UInt16 _register_name, out int tmpDataint, out float fTemp)
		{
			byte[] _tempBytes = new byte[4];
			int _data_err = 0;
			_tempBytes[0] = _serialData[7];
			_tempBytes[1] = _serialData[6];
			_tempBytes[2] = _serialData[5];
			_tempBytes[3] = _serialData[4];
			tmpDataint = 0;
			fTemp = 0.0f;

			try
			{
				tmpDataint = BitConverter.ToInt32(_tempBytes, 0);
			}
			catch { _data_err += 1; }
			try
			{
				fTemp = BitConverter.ToSingle(_tempBytes, 0);
			}
			catch { _data_err += 1; }

			_axis_num = _serialData[1];
			_register_name = (UInt16)(((_serialData[2] << 8) | (_serialData[3])) & 0xFFF);
			return true;
		}

接收数据:

		int axis_to_set = 0;
		// 接收数据
		/// <summary>
		/// 
		/// </summary>
		/// <param name="_axis_num">从站地址为1</param>
		/// <param name="_register_name">下发的指令</param>
		/// <param name="tmpDataint">整型</param>
		/// <param name="fTemp">浮点型</param>
		void ProcessReceivedData(UInt16 _axis_num, UInt16 _register_name, int tmpDataint, float fTemp)
		{
			if (_axis_num == (UInt16)axis_to_set || axis_to_set == 0 || _axis_num == 0
				|| _register_name == 0x11 || _register_name == 0x12)
			{
				//参数、数值反馈等
				if ((_register_name >= 0x101 && _register_name <= 0x10C) ||
					(_register_name >= 0x201 && _register_name <= 0x20C))
				{
					if (true == (GetDataList.ContainsKey(_register_name)))
					{
						this.BeginInvoke(new EventHandler(delegate
						{
							GetDataList[_register_name].Text = fTemp.ToString();
						}));
					}
				}
				else
				{
					if (true == (GetDataList.ContainsKey(_register_name)))
					{
						this.BeginInvoke(new EventHandler(delegate
						{
							if (_register_name == 0x11 || _register_name == 0x12)
							{
								GetDataList[_register_name].Text = tmpDataint.ToString();
							}
							else
							{
								if (_register_name == 0x2F)
								{
									GetDataList[_register_name].Text = fTemp.ToString();
								}
								else if (_register_name == 0x331)
								{
									GetDataList[_register_name].Text = fTemp.ToString();
								}
								else
								{
									GetDataList[_register_name].Text = fTemp.ToString();
								}
							}

						}));
					}
				}
			}
		}

  • 2
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 上位机下位机是指两个不同的计算机系统之间的关系。 上位机是指控制、管理、处理数据的计算机系统,通常性能比较强大,可以独立运行复杂的应用程序,同时也能连接多个下位机,对它们进行监控、控制和数据处理。上位机通常用于较高层次的应用程序,如数据分析、控制中心、图形用户界面等。 下位机是指被控制、被监控、被采集数据的计算机系统,通常性能比较低,只能运行一些简单的应用程序。下位机通常用于较低层次的应用程序,如传感器、执行器、智能家居等。 在工业自动化、物联网等领域中,上位机下位机经常配合使用,实现控制、采集、处理和存储等功能。 ### 回答2: 上位机下位机是在自动化控制领域中常用的术语。首先,我们先来了解下位机下位机通常指的是机器或设备中的控制器,它负责接收来自上位机或其他控制系统发送的指令,对机器或设备进行操作控制,监测各种参数,并将相关数据反馈给上位机下位机通常具备一定的自主控制能力,可以实现自动化操作,比如工业设备、机器人、仪器仪表等。 而上位机则是下位机的上级控制系统,它通常是通过人机交互界面与操作人员进行交互,控制和监控下位机或其他控制系统的运行。上位机负责制定整体控制策略、编写和编辑控制程序,以及进行数据处理和分析。它可以向下位机发送指令,获取下位机的实时数据,并对数据进行监测、记录和展示。上位机更加注重对控制系统的整体调度和监控,提供人机界面让操作人员进行操作和反馈。 上位机下位机通过串口、以太网或其他通信方式进行数据传输和通信上位机下位机的配合使用,可以实现对复杂系统的控制和管理,提高生产效率和产品质量。通过上位机的灵活性和可操作性,操作人员可以更方便地与控制系统交互,实时监测和控制,提高控制系统的可靠性和稳定性。 总之,上位机下位机是自动化控制领域中不可或缺的两个组成部分,它们共同工作,实现对机器或设备的控制和监控。 ### 回答3: 上位机下位机是指在自动控制系统中,根据其数据处理能力和所处的位置,划分的两个不同的部分。 上位机位于自动控制系统的较高层,通常是指负责系统的总体监控、控制和管理的计算机设备。上位机具有强大的数据处理能力和控制能力,它能够通过传感器采集到的实时数据来进行分析、处理和控制。上位机通过与下位机通信,向下位机发送控制指令,并接收来自下位机的反馈信息,以实现对整个自动控制系统的监控和控制。 下位机位于自动控制系统的较低层,通常是指负责执行具体控制任务的设备,比如PLC(可编程逻辑控制器)或嵌入式控制器。下位机通过传感器采集到的数据,经过自身的逻辑处理和运算,执行相应的控制任务,并将控制结果反馈给上位机下位机通常需要快速响应和执行指令,同时需要与现场设备进行连接和通信上位机下位机之间通过一定的通信协议进行数据交换与传输,以确保上位机能够及时获得下位机采集到的数据,并发送控制指令给下位机。通过上位机下位机的结合,自动控制系统能够实现高效的数据处理、精确的控制和灵活的监控,提高生产效率和质量,减少人工干预,提升自动化程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值