当前位置:首页 > 模拟 > 模拟
[导读]什么是上位机 上位机是一台可以发出特定操控命令的计算机,通过操作预先设定好的命令,将命令传递给下位机,通过下位机来控制设备完成各项操作(应用最多的地方如:工业、水利、供电部门、交通等方面)。上位机都有

什么是上位机
上位机是一台可以发出特定操控命令的计算机,通过操作预先设定好的命令,将命令传递给下位机,通过下位机来控制设备完成各项操作(应用最多的地方如:工业、水利、供电部门、交通等方面)。上位机都有特定的编程,有专门的开发系统,或以上是已经规定好任务,只能按特定的任务进行操作。简单说上位机就是命令的下达者,而下位机则是命令的执行者。

上位机软件介绍
下面介绍一种软件:物联网应用中收集感知节点信息,进行显示,控制的应用控制台。此软件主要有两部分组成,数据收发部分和显示部分
1、上位机在系统中的位置:处于网络层中,与嵌入式网关通过网线相连。实际应用时是放置在实验室的老师工作台上,供实验室的老师使用。
2、上位机的功能:此软件实时监视实验实中每个实验台的状况,包括上电或断电状态,实验台是否发出了警告,是否发出了求助信号,并对这些信号做出应答,还控制LED屏的文字显示。
3、上位机的设计实现: 此软件主要有两部分组成,数据收发部分和显示部分。数据收发指的是和嵌入式网关的数据收发。两者是通过网线连接的,所以应用的是TCP/IP 的Socket 套接字编程,嵌入式网关的设计中已经提到过,它在和上位机通信中是作为服务器的,那么上位机就是作为连接发起方。为了能保证网络连接的稳定性,我们把Socket读写的程序代码放在了try{} catch(){} 块中,一旦网络连接不正常,就会捕获到该异常,从而关闭程序。
4、关键代码如下:
private void ReadFromArm()
        {
            byte[] buffertocheck = new byte[1];
            int bytesize = 0;
            do
            {
                byte[] bufferofread = new byte[1024];
                try { bytesize = stream.Read(bufferofread, 0, bufferofread.Length); }
                catch (Exception ex) { connection = Indicator.Unconnected; MessageBox.Show("连接中断,程序将退出。");  Application.Exit(); read.Abort(); }
                //MessageBox.Show(BitConverter.ToString(bufferofread));
                byte[] buffertochecktemp = buffertocheck;
                buffertocheck = new byte[buffertochecktemp.Length + bytesize];
                Array.Copy(buffertochecktemp, 0, buffertocheck, 0, buffertochecktemp.Length);
                Array.Copy(bufferofread, 0, buffertocheck, buffertochecktemp.Length, bytesize);
                int index_1, index_2;
                while (Check7E(buffertocheck, out index_1, out index_2))
                {
                    byte[] buffertodecode = new byte[index_2 + 1 - index_1];
                    Array.Copy(buffertocheck, index_1, buffertodecode, 0, index_2 + 1 - index_1);
                    byte[] bufferofdecode = PPP.Decode(buffertodecode);
                    //MessageBox.Show(BitConverter.ToString(bufferofdecode));
                    if (bufferofdecode[0] == bufferofdecode.Length && CheckSum(bufferofdecode))//保证从ARM来的帧是正确的
                    {
                        byte[] Zuohao = new byte[2];
                        int subindex = 1, index = bufferofdecode[1]*256+bufferofdecode[2]-1;
                        string status=null;
                        switch (bufferofdecode[3])//分别处理从ARM来的帧
                        {

                            case POWER_ON://从ARM来的上电状态
                                status = "上电";
                                subindex = 1;
                                break;
                            case POWER_OFF://从ARM来的断电状态
                                status = "断电";
                                subindex = 1;
                                break;
                            case ABNORMAL://从ARM来的异常状态
                                status = "异常";
                                subindex = 1;
                                break;
                            case WARNING://从ARM来的警告信号
                                status = "有";
                                subindex = 2;
                                break;
                            case NEED_HELP://从ARM来的求救信号
                                status = "有";
                                subindex = 3;
                                break;
                        }
                        if (0 <= index && index <= 49)
                        {
                            listView1.Items[index].SubItems[subindex].Text = status;
                            if (status == "异常" || status == "有")
                                listView1.Items[index].SubItems[subindex].ForeColor = Color.Red;
                            else
                                listView1.Items[index].SubItems[subindex].ForeColor = Color.Black;
                        }
                    }
                    int newlength = buffertocheck.Length - 1 - index_2;
                    if (newlength == 0)
                    {
                        buffertocheck = new byte[1];
                    }
                    else
                    {
                        buffertochecktemp = buffertocheck;
                        buffertocheck = new byte[newlength];
                        Array.Copy(buffertochecktemp, index_2 + 1, buffertocheck, 0, newlength);
                    }
                }
            } while (connection == Indicator.Connected);
        }
        /// <summary>
        /// 向ARM发送
        /// </summary>
        /// <param name="Zuohao">座号 2字节</param>
        /// <param name="mingling">命令字 1字节</param>
        public void WriteToArm(byte[] Zuohao, byte mingling)
        {
            if (connection == Indicator.Connected)//在与ARM保持连接的情况下可写
            {
                byte[] frame = new byte[5];
                frame[0] = 0x05;
                Array.Copy(Zuohao, 0, frame, 1, 2);
                frame[3] = mingling;
                byte temp = 0;
                foreach (byte item in frame)
                    temp += item;
                frame[4] = (byte)(0 - temp);
                byte[] frametosend = PPP.Encode(frame);
                Console.WriteLine(BitConverter.ToString(frametosend));
                try { stream.Write(frametosend, 0, frametosend.Length); }
                catch (Exception ex) { }
            }
        }
        /// <summary>
        /// 向ARM发送
        /// </summary>
        /// <param name="Zuohao">座号 2字节</param>
        /// <param name="mingling">命令字加ASC码 n字节</param>
        public void WriteToArm(byte[] Zuohao, byte[] minglingandASC)
        {
            if (connection == Indicator.Connected)//在与ARM保持连接的情况下可写
            {
                byte[] frame = new byte[4+minglingandASC.Length];
                frame[0] = (byte)frame.Length;
                Array.Copy(Zuohao, 0, frame, 1, 2);
                Array.Copy(minglingandASC,0,frame,3,minglingandASC.Length);
                byte temp = 0;
                foreach (byte item in frame)
                    temp += item;
                frame[frame.Length-1] = (byte)(0 - temp);
                byte[] frametosend = PPP.Encode(frame);
                Console.WriteLine(BitConverter.ToString(frametosend));
                try { stream.Write(frametosend, 0, frametosend.Length); }
                catch (Exception ex) { }
            }
        }

另外数据收发还需要协议,和嵌入式网关通信的指令和协议定制如下:



因此数据量较少,协议也就比较简单,此协议在发送接收时用PPP封装。显示部分使用C#编写的运行于Windows .Net Framework 上的窗体应用程序,根据实际需求,对每个实验台状态的显示使用ListView控件实现,当出现异常情况,或实验台出现警告、求助信号时,ListView的相应字段文字会通过改变颜色来提醒监视人员,监视人员还可以通过一个文字发送窗体来向LED屏发送要显示的文字。总之界面清晰直观,简便易用。
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

作者 Mohamad Ali| IBM咨询首席运营官 北京2024年5月24日 /美通社/ -- 生成式AI的兴起几乎在所有面向上给业务带来改变。根据 IBM 商业价值研究院最新的年度 CEO 研究,近60%...

关键字: IBM AI BSP 模型

台北2024年5月21日 /美通社/ -- 提供针对AMD WRX90和TRX50主板优化的DDR5 OC R-DIMM 提供容量128GB(16GBx8)到768GB(96GBx8),速度5600MHz到8...

关键字: AMD 内存 BSP GB

上海2024年5月20日 /美通社/ -- 2024年5月16日,世界知名的生命科学公司 Eppendorf 集团于第二十三届生物制品年会上成功举办了"疫路超越 推流出新"的产品发布会,正式推出大规模...

关键字: RF PEN BSP IMAC

北京2024年5月20日 /美通社/ -- 过去五年里,支付和收款方式日新月异,其发展和变化比过去五十年都要迅猛。从嵌入式数字商务的出现,到"一拍即付"的...

关键字: VI BSP PAY COM

杭州2024年5月20日 /美通社/ -- 5月20日,百世供应链旗下百世云仓在2024年全国网络大会上,宣布了其全面出海战略。聚焦于东南亚市场的新机遇,并积极推动品牌走向国际市场。 百世供应链召开2024年百世云仓全...

关键字: 供应链 网络 触点 软件

华钦科技集团(纳斯达克代码: CLPS ,以下简称"华钦科技"或"集团")近日宣布致敬 IBM 大型机 60 载辉煌历程,并将继续实施集团大型机人才培养计划。

关键字: IBM BSP 研发中心 PS

助力科研与检测新突破 上海2024年5月15日 /美通社/ -- 全球知名的科学仪器和服务提供商珀金埃尔默公司今日在上海举办了主题为"创新不止,探索无界"的新品发布会,集中展示了其在分析仪器领域的最...

关键字: 质谱仪 BSP DSC 气相色谱

上海2024年5月16日 /美通社/ -- 2024年5月10日至5月13日,富士胶片(中国)投资有限公司携旗下影像产品创新力作亮相北京P&E 2024。在数码相机展览区域,全新制定的集团使命"为世界绽...

关键字: 富士 数码相机 影像 BSP

贝克曼库尔特目前已成为MeMed Key免疫分析平台和MeMed BV检测技术的授权经销商 在原有合作的基础上,继续开发适用于贝克曼库尔特免疫分析仪的MeMed BV检测 加州布瑞亚和以色列海法2024年5月16日...

关键字: BSP IO 检测技术 免疫分析仪

英国英泰力能的燃料电池是可产业化的产品解决方案 英国首个专为乘用车市场开发的燃料电池系统 在 157kW 功率下,此燃料电池比乘用车的其他发动机更为强大 &...

关键字: ENERGY INTELLIGENT 氢燃料电池 BSP
关闭
关闭