上位机是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化(液压,水位,温度等)。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。简言之如此,实际情况千差万别,但万变不离其宗:上下位机都需要编程,都有专门的开发系统。


上位机的工作原理

上位机系统的工作原理基于一种客户端-服务器(Client-Server)模型。上位机主机充当服务器,下位机设备则扮演客户端的角色。


首先,下位机设备通过传输介质(如以太网、串行通信等)将数据传输给上位机主机。下位机设备可以是远程终端单元(RTU)、可编程逻辑控制器(PLC)或其他类似设备。上位机主机接收到来自下位机的数据后,对其进行处理和解析,然后将结果显示在可视化界面上。



服务端实在上篇基础上实现的。需要做如下更改:

while (true)

            {

              try

              {

                byte[] bufferDate = new byte[1024];

                int realLen = pSocket.Receive(bufferDate);

                if (realLen <= 0)

                {

                  this.Invoke(addTextDelegate, pSocket.RemoteEndPoint.ToString() + "退出\r\n");

                  socketList.Remove(pSocket);

                  //客户端退出的时候会发送一个空字节

                  pSocket.Shutdown(SocketShutdown.Both);

                  pSocket.Close();

                  return;

                }

                string receiveStr = Encoding.Default.GetString(bufferDate, 0, realLen);

                switch (receiveStr)

                {

                  case "MEAS:VOLTage:ALL?\n":

                    proxSocket.Send(Encoding.Default.GetBytes(r.Next(16,25).ToString()+ ","+r.Next(16, 25).ToString()+","+ r.Next(16, 25).ToString()));

                    break;

                  case "MEAS:CURR:ALL?\n":

                    proxSocket.Send(Encoding.Default.GetBytes(r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString()));

                    break;

                  default:

                    break;

                }

                this.Invoke(addTextDelegate, receiveStr + "from" + pSocket.RemoteEndPoint.ToString() + "\r\n");

              }

              catch (Exception ex)

              {

                this.Invoke(addTextDelegate, pSocket.RemoteEndPoint.ToString() + "异常退出\r\n");

                socketList.Remove(pSocket);

                pSocket.Shutdown(SocketShutdown.Both);

                pSocket.Close();

                return;

              }

            }