电梯仿真程序
PLC编程仿真——3层电梯控制

PLC 编程与仿真 1•电梯控制要求 <1)当电梯停在1层或2层时,按S3按钮呼梯则电梯上升至LS3停。
<2)当电梯停在1层,按S2按钮和S3按钮呼梯,则电梯上升至 LS2暂停5秒 后继续上升到LS3停。
<3)当电梯停于2层,若按S3按钮呼梯,则电梯上升到LS3停。
<4)当电梯停于3层,若按S2按钮呼梯,则电梯下降到LS2停止。
<5)当电梯停于3层,而S2 S1按钮均有人呼梯,则电梯下降到 LS2暂停5秒 后继续下降到LS1停止。
<6)当电梯停于2层,而S1、S3按钮均有人呼梯,则电梯先下降至 LS1暂停5 秒,再上升至LS3停止。
<7)应具有电梯的运行方向指示。
<8)电梯内显示电梯所在楼层。
<9)电梯运行期间不能开门。
<10)电梯不关门不允许运行。
2.硬件配置+ o FN-GOO.+ :r ] Gateway + _J IM-300 + _| H7-EXTENSION + Cj PS-300 + _□ RACK-'SOO -LJ SN-300+ □ AI-300+ 口 Al/AO -300+ i_J AD-300 -口 DI-300U SM 321 Stf 321SW 321 13 <?IH6B57 ^21-lBLUO-OAWJ茎疗量铺忙慎块M32 24 V,分成32据:同时可 作为 SIPLUS 複块.订货号 6AG1321-1BLOO-2AAO3.电梯PLC 控制的I/O 分配表表3-1 I/O 分配表名称~输入点~ 名称~输出点14i Fb : I.Vj 选顼追)或口逋.i 帮勸S 您 血血融口配養立件:礙DIl&x 43-125WCDIl&xA£12a/Z3aV DI16xAC120VTIT 1 C … CEF一层位置 10.0 电梯上行信号 Q0.0 二层位置 10.1 电梯下行信号 Q0.1 三层位置 I0.2 电梯电机正转 Q0.6 一楼内呼叫指令 I0.3 电梯电机反转 Q0.7 二楼内呼叫指令 I0.4 一楼内呼叫指示 Q0.3 三楼内呼叫指令 I0.5 二楼内呼叫指示 Q0.4 一楼外上行呼叫 I1.0 三楼内呼叫指示 Q0.5 二楼外上行呼叫 11.1 一楼上行呼叫指示 Q1.0 二楼外下行呼叫 11.2 二楼上行呼叫指示 Q1.1 三楼外下行呼叫 11.3 二楼下行呼叫指示 Q1.2 手动开门指令 I2.0 三楼下行呼叫指示 Q1.3 手动关门指令 I2.1 开门电机信号 Q1.4 开门限位开关 I2.2 关门电机信号Q1.5关门限位开关 I2.3 电梯上行限位开关 I2.4电梯下行限位开关12.54•电梯PLC 控制的程序剖析第一步:编写电梯外呼信号的产生、指示、消失的程序。
基于单片机的电梯仿真程序课程设计

目录(一)前言 (1)(二)现代电梯概述 (3)(三)硬件部分设计 (6)(四)软件部分设计 (12)(五)电梯运行界面 (52)(六)设计总结与感悟 (56)(七)参考文献 (57)电梯仿真程序一、前言:本电梯仿真程序采用的是一个基于单片机及其相关外设,编程语言采用汇编与C语言结合的方式,通过矩阵键盘线反选法输入楼层,上、下行等控制信号,经I\O口读入,进行相关实时控制,软硬件结合的仿真系统,输出设备包括由CD4511驱动显示楼层的7段数码管,显示实时信息的显示屏LCD12864,由PWM控制显示电梯门开关的舵机,以及由I\O口间接控制的驱动电机正反转双桥驱动电路等几个部分组成。
可以实现真实电梯中,任意层呼叫,目的层到达按要求顺序到达,开关门,无输入自动回1层等一系列功能,并实时显示当前电梯运行状态,关于真实电梯门控光幕装置,电机自动抱闸平层等部分,由于知识不足,没有足一实现,但会在接下来的专业知识学习过程中不断完善,同时也希望得到程老师的指导。
二、现代电梯概述:电梯是一种以电动机为动力的垂直升降机,装有箱状吊舱,用于多层建筑乘人或载运货物。
也有台阶式,踏步板装在履带上连续运行,俗称自动电梯。
服务于规定楼层的固定式升降设备。
它具有一个轿厢,运行在至少两列垂直的或倾斜角小于15°的刚性导轨之间。
轿厢尺寸与结构形式便于乘客出入或装卸货物,本次微机课程设计电梯仿真选用的是垂直升降梯。
2.1、电梯功能现代电梯主要由曳引机(绞车)、导轨、对重装置、安全装置(如限速器、安全钳和缓冲器等)、信号操纵系统、轿厢与厅门等组成。
这些部分分别安装在建筑物的井道和机房中。
通常采用钢丝绳摩擦传动,钢丝绳绕过曳引轮,两端分别连接轿厢和平衡重,电动机驱动曳引轮使轿厢升降。
电梯要求安全可靠、输送效率高、平层准确和乘坐舒适等。
电梯的基本参数主要有额定载重量、可乘人数、额定速度、轿厢外廓尺寸和井道型式等。
简单使用方法(紧急情况下面有解决方法)载人电梯都是微机控制的智能化、自动化设备,不需要专门的人员来操作电梯电梯结构图电梯内部结构图驾驶,普通乘客只要按下列程序乘坐和操作电梯即可。
电梯模拟程序课程设计

电梯模拟程序课程设计一、课程目标知识目标:1. 让学生理解电梯的工作原理,掌握电梯运行的模拟编程知识。
2. 使学生掌握利用流程图描述电梯运行逻辑的方法。
3. 帮助学生理解并运用条件语句和循环语句实现电梯模拟程序。
技能目标:1. 培养学生运用编程语言(如Scratch或Python)编写简单电梯模拟程序的能力。
2. 培养学生通过流程图分析问题、解决问题的能力。
3. 提高学生团队协作、沟通交流的能力。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学生主动探索新知识的热情。
2. 培养学生严谨、细心的学习态度,增强面对困难的勇气和毅力。
3. 培养学生遵守程序设计规范,养成良好的编程习惯。
课程性质:本课程为信息技术学科的课程,以项目式学习为主,注重实践操作和团队合作。
学生特点:学生为五年级学生,具备一定的信息技术基础,对新事物充满好奇,喜欢动手操作。
教学要求:教师需引导学生通过自主探究、小组合作等方式完成课程内容,注重培养学生的实践能力和创新精神。
同时,关注学生的个体差异,提供有针对性的指导。
通过本课程的学习,使学生能够达到上述课程目标,实现具体的学习成果。
二、教学内容1. 电梯工作原理介绍:包括电梯的基本结构、运行原理、信号控制系统等,让学生对电梯的运行机制有整体认识。
2. 编程语言基础:回顾并巩固Scratch或Python编程语言的基础知识,如变量、列表、条件语句、循环语句等,为编写电梯模拟程序打下基础。
3. 流程图设计:学习如何利用流程图描述电梯运行的逻辑过程,分析电梯运行中的各种情况,并进行流程图设计。
4. 电梯模拟程序编写:根据流程图,运用所学编程知识,分组合作编写电梯模拟程序,实现基本的运行、停止、开门、关门等功能。
5. 程序调试与优化:指导学生如何调试程序,发现并解决程序中的问题,提高程序的稳定性和运行效率。
教学内容安排和进度:第一课时:电梯工作原理介绍,回顾编程语言基础知识。
第二课时:学习流程图设计,分析电梯运行逻辑。
VHDL电梯控制器程序设计与仿真

VHDL电梯控制器程序设计与仿真————————————————————————————————作者:————————————————————————————————日期:2电梯控制器VHDL程序与仿真。
----文件名:dianti.vhd。
--功能:6层楼的电梯控制系统。
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity dianti isport ( clk : in std_logic; --时钟信号(频率为2Hz)full,deng,quick,clr : in std_logic; --超载、关门中断、提前关门清除报警信号c_u1,c_u2,c_u3,c_u4,c_u5: in std_logic; --电梯外人的上升请求信号c_d2,c_d3,c_d4,c_d5,c_d6 : in std_logic; --电梯外人的下降请求信号d1,d2,d3,d4,d5,d6 : in std_logic; --电梯内人的请求信号g1,g2,g3,g4,g5,g6 : in std_logic; --到达楼层信号door : out std_logic_vector(1 downto 0); --电梯门控制信号led : out std_logic_vector(6 downto 0); --电梯所在楼层显示led_c_u:out std_logic_vector(5 downto 0); --电梯外人上升请求信号显示led_c_d:out std_logic_vector(5 downto 0); --电梯外人下降请求信号显示led_d : out std_logic_vector(5 downto 0); --电梯内请求信号显示wahaha : out std_logic; --看门狗报警信号ud,alarm : out std_logic; --电梯运动方向显示,超载警告信号up,down : out std_logic ); --电机控制信号和电梯运动end dianti;architecture behav of dianti issignal d11,d22,d33,d44,d55,d66:std_logic; --电梯内人请求信号寄存信号signal c_u11,c_u22,c_u33,c_u44,c_u55:std_logic; --电梯外人上升请求信号寄存信号signal c_d22,c_d33,c_d44,c_d55,c_d66:std_logic; --电梯外人下降请求信号寄存信号signal q:integer range 0 to 1; --分频信号signal q1:integer range 0 to 6; --关门延时计数器signal q2:integer range 0 to 9; --看门狗计数器signal dd,cc_u,cc_d,dd_cc:std_logic_vector(5 downto 0); --电梯内外请求信号寄存器signal opendoor:std_logic; --开门使能信号signal updown:std_logic; --电梯运动方向信号寄存器signal en_up,en_dw:std_logic; --预备上升、预备下降预操作使能信号begincom:process(clk)beginif clk'event and clk='1' thenif clr='1' then q1<=0;q2<=0;wahaha<='0'; --清除故障报警elsif full='1' then alarm<='1'; q1<=0; --超载报警if q1>=3 then door<="10";else door<="00";end if;elsif q=1 then q<=0;alarm<='0';if q2=3 then wahaha<='1'; --故障报警elseif opendoor='1' then door<="10";q1<=0;q2<=0;up<='0';down<='0'; --开门操作elsif en_up='1' then --上升预操作if deng='1' then door<="10";q1<=0;q2<=q2+1; --关门中断elsif quick='1' then q1<=3; --提前关门elsif q1=6 then door<="00";updown<='1';up<='1'; --关门完毕,电梯进入上升状态elsif q1>=3 then door<="01";q1<=q1+1; --电梯进入关门状态else q1<=q1+1;door<="00"; --电梯进入等待状态end if;elsif en_dw='1' then --下降预操作if deng='1' then door<="10";q1<=0;q2<=q2+1;elsif quick='1' then q1<=3;elsif q1=6 then door<="00";updown<='0';down<='1';elsif q1>=3 then door<="01";q1<=q1+1;else q1<=q1+1;door<="00";end if;end if;if g1='1' then led<="1001111"; --电梯到达1楼,数码管显示1if d11='1' or c_u11='1' then d11<='0'; c_u11<='0';opendoor<='1';--有当前层的请求,则电梯进入开门状态elsif dd_cc>"000001" then en_up<='1'; opendoor<='0';--有上升请求,则电梯进入预备上升状态elsif dd_cc="000000" then opendoor<='0'; --无请求时,电梯停在1楼待机end if;elsif g2='1' then led<="0010010"; --电梯到达2楼,数码管显示2 if updown='1' then --电梯前一运动状态位上升if d22='1' or c_u22='1' then d22<='0'; c_u22<='0'; opendoor<='1';--有当前层的请求,则电梯进入开门状态elsif dd_cc>"000011" then en_up<='1'; opendoor<='0';--有上升请求,则电梯进入预备上升状态elsif dd_cc<"000010" then en_dw<='1'; opendoor<='0';--有下降请求,则电梯进入预备下降状态end if;--电梯前一运动状态为下降elsif d22='1' or c_d22='1' then d22<='0'; c_d22<='0';opendoor<='1';--有当前层的请求,则电梯进入开门状态elsif dd_cc<"000010" then en_dw<='1'; opendoor<='0';--有下降请求,则电梯进入预备下降状态elsif dd_cc>"000011" then en_up<='1'; opendoor<='0';--有上升请求,则电梯进入预备上升状态end if;elsif g3='1' then led<="0000110"; --电梯到达3楼,数码管显示3 if updown='1' thenif d33='1' or c_u33='1' then d33<='0'; c_u33<='0';opendoor<='1';elsif dd_cc>"000111" then en_up<='1'; opendoor<='0';elsif dd_cc<"000100" then en_dw<='1'; opendoor<='0';end if;elsif d33='1' or c_d33='1' then d33<='0'; c_d33<='0'; opendoor<='1';elsif dd_cc<"000100" then en_dw<='1'; opendoor<='0';elsif dd_cc>"000111" then en_up<='1'; opendoor<='0';end if;elsif g4='1' then led<="1001100"; --电梯到达4楼,数码管显示4 if updown='1' thenif d44='1' or c_u44='1' then d44<='0'; c_u44<='0'; opendoor<='1';elsif dd_cc>"001111" then en_up<='1'; opendoor<='0';elsif dd_cc<"001000" then en_dw<='1'; opendoor<='0';end if;elsif d44='1' or c_d44='1' then d44<='0'; c_d44<='0'; opendoor<='1';elsif dd_cc<"001000" then en_dw<='1'; opendoor<='0';elsif dd_cc>"001111" then en_up<='1'; opendoor<='0';end if;elsif g5='1' then led<="0100100"; --电梯到达5楼,数码管显示5if updown='1' thenif d55='1' or c_u55='1' then d55<='0'; c_u55<='0';opendoor<='1';elsif dd_cc>"011111" then en_up<='1'; opendoor<='0';elsif dd_cc<"010000" then en_dw<='1'; opendoor<='0';end if;elsif d55='1' or c_d55='1' then d55<='0'; c_d55<='0';opendoor<='1';elsif dd_cc<"010000" then en_dw<='1'; opendoor<='0';elsif dd_cc>"011111" then en_up<='1'; opendoor<='0';end if;elsif g6='1' then led<="0100000"; --电梯到达6楼,数码管显示6 if d66='1' or c_d66='1' then d66<='0'; c_d66<='0';opendoor<='1';elsif dd_cc<"100000" then en_dw<='1'; opendoor<='0';end if;else en_up<='0';en_dw<='0'; --电梯进入上升或下降状态end if;end if;else q<=1;alarm<='0'; --清除超载报警if d1='1' then d11<=d1; --对电梯内人请求信号进行检测和寄存elsif d2='1' then d22<=d2;elsif d3='1' then d33<=d3;elsif d4='1' then d44<=d4;elsif d5='1' then d55<=d5;elsif d6='1' then d66<=d6;end if;if c_u1='1' then c_u11<=c_u1; --对电梯外人上升请求信号进行检测和寄存elsif c_u2='1' then c_u22<=c_u2;elsif c_u3='1' then c_u33<=c_u3;elsif c_u4='1' then c_u44<=c_u4;elsif c_u5='1' then c_u55<=c_u5;end if;if c_d2='1' then c_d22<=c_d2; --对电梯外人下降请求信号进行检测和寄存elsif c_d3='1' then c_d33<=c_d3;elsif c_d4='1' then c_d44<=c_d4;elsif c_d5='1' then c_d55<=c_d5;elsif c_d6='1' then c_d66<=c_d6;end if;dd<=d66&d55&d44&d33&d22&d11; --电梯内人请求信号并置cc_u<='0'&c_u55&c_u44&c_u33&c_u22&c_u11; --电梯外人上升请求信号并置cc_d<=c_d66&c_d55&c_d44&c_d33&c_d22&'0'; --电梯外人下降请求信号并置dd_cc<=dd or cc_u or cc_d; --电梯内、外人请求信号进行综合end if;ud<=updown; --电梯运动状态显示led_d<=dd; --电梯内人请求信号显示led_c_u<=cc_u; --电梯外人上升请求信号显示led_c_d<=cc_d; --电梯外人下降请求信号显示end if;end process;end behav;电梯程序仿真注:由于以上输入信号在下面仿真中没用到,所以在下面仿真图中将不再出现。
基于PLC四层电梯内含组态王仿真程序设计说明

1.2课题的研究背景与意义
电梯是集机电一体的复杂系统,不仅涉与机械传动、电气控制和土建等工程领域,还要考虑可靠性、舒适感和美学等问题。而对现代电梯而言,应具有高度的安全性。事实上,在电梯上已经采用了多项安全保护措施。在设计电梯的时候,对机械零部件和电器元件都采取了很大的安全系数和保险系数。然而,只有电梯的制造,安装调试、售后服务和维修保养都达到高质量,才能全面保证电梯的最终高质量。在国外,已“法规”实行电梯制造、安装和维修一体化,实行由各制造企业认可的、法规认证的专业安装队伍维修单位,承担安装调试、定期维修和检查试验,从而为电梯运行的可靠性和安全性提供了保证。因此,可以说乘坐电梯更安全。美国一家保险公司对电梯的安全性做过认真地调查和科学计算,其结论是:乘电梯比走楼梯安全5倍。掘资料统计,在美国乘其他交通工具的人数每年约为80亿人次,而乘电梯的人数每年却有540亿人次之多。目前,由可编程序控制器(PLC)和微机组成的电梯运行逻辑控制系统,正以很快的速度发展着。采用PLC控制的电梯可靠性高、维护方便、开发周期短,这种电梯运行更加可靠,并具有很大的灵活性,可以完成更为复杂的控制任务,己成为电梯控制的发展方向。
总之,电梯的控制是比较复杂的,可编程控制器的使用为电梯的控制提供了广阔的空间。PLC是专门为工业过程控制而设计的控制设备,随着PLC应用技术的不断发展,将使得它的体积大大减小,功能不断完善,过程的控制更平稳、可靠,抗干扰性能增强、机械与电气部件有机地结合在一个设备,把仪表、电子和计算机的功能综合在一起[3]。因此,它已经成为电梯运行中的关键技术。
Key Words:Four-storyElevator;Control System;ProgrammableLogic Controller;kingview
电梯控制器的VHDL程序设计与仿真

论文题目:电梯控制器的VHDL程序设计与仿真专业:微电子学本科生:陈伟伟(签名)___________指导教师:岳改丽(签名)___________摘要本设计(改为论文)主要介绍了基于FPGA设计的五层电梯控制器,采用VHDL语言进行编译,并进行了电路综合和仿真。
该控制器具备了FPGA芯片的硬件体积小、实时性好、工作效率高、提高系统的集成度等特点且遵循方向优先的原则,提供五个楼层多个用户的载客服务,并指示电梯的运行情况。
本设计的亮点是使用状态机的方法来完成电梯的几个运行状态。
(改,)将主控制器的状态分为6种,停止、等待、上升、连续上升、下降及连续下降,状态的划分与楼层无关(增加,)因此具有很强的通用性。
本课题试验调试平台是Altera公司的Quartus Ⅱ软件和EDA实验开发系统。
(改,)通过程序的调试和(改、)运行及仿真表明本设计可以完成电梯所在楼层显示和电梯运行方向指示。
关键字:FPGA,VHDL,电梯控制器,状态机大红色要删去,下同Subject: The study and simulation of elevator controller based on VHDL Specialty: MicroeletronicsName: Weiwei Chen (Signature) ___________ Instructor: G aili Yue (Signature) ___________ABSTRCTThis design introduces the five floors elevator controller compiled with VHDL and the synthesis and simulation of the circuit. The controller follows the direction of the principle of priority, to provide the service of multiple users, and indicates the operation of the lift. This controller has FPGA chip compact hardware, good real-time, high efficiency, improve the system integration characteristics .Using state machine is a strong point of this design. The main controller is divided into six states. The state has nothing to do with floors, so it has a strong common use. The debugging platform of this topic is Altera QuartusⅡsoftware and EDA experiment development system. Through the process of debugging、running and the simulation shows that this design can finish the function of the elevator direction and floor’s display.KEY WORDS: FPGA, VHDL, Elevator Controller, State Machine目录1绪论 (1)1.1 选题的背景 (1)1.2 电梯控制器的研究背景 (1)1.3 我国电梯的发展状况 (1)1.4 电梯设计的具体目的及控制要求..................................................................... .2 2设计基础依据(改为工具介绍). (4)2.1EDA技术介绍 (4)2.2FPGA简介 (6)2.2.1EDA实验开发平台 (7)2.2.2 EP2C5核心板(字号?) (7)2.3硬件描述语言 (8)2.3.1VHDL和VerilogHDL比较 (8)2.3.2VHDL语言的基本特点 (8)2.3.3 VHDL的设计流程 (9)2.3.4 VHDL程序的基本结构 (9)2.3.5 状态机的简介 (10)2.4 QuartusII软件介绍 (11)3电梯控制器的设计及仿真 (14)3.1 电梯及电梯控制器的功能简介 (14)3.1.1 电梯的机械组成 (14)3.1.2电梯控制器的工作原理 (15)3.2 电梯控制器的程序设计 (15)3.2.1 电梯的总体控制思想 (16)3.2.2 电梯控制器的程序流程图 (17)3.2.3模块设计与实现 (18)3.3程序调试与下载 (28)3.3.1 程序调试 (28)3.3.2从设计文件到目标器件的下载 (29)3.3.3 加载及显示结果 (29)结论 (33)致谢.................................................................................... 错误!未定义书签。
c语言模拟电梯程序
c语言模拟电梯程序我们需要定义电梯的状态。
电梯可以处于静止、上升或下降三种状态中的一种。
我们可以使用一个整型变量来表示电梯的状态,0表示静止,1表示上升,-1表示下降。
接下来,我们需要定义电梯的位置。
电梯可以停在不同的楼层,我们可以使用一个整型变量来表示电梯当前所在的楼层。
我们需要定义一个数组来记录每一层楼的乘客请求。
数组的每一个元素表示该楼层的请求状态,0表示无请求,1表示有上升请求,-1表示有下降请求。
在主程序中,我们可以使用一个循环来模拟电梯的运行过程。
在每一次循环中,我们首先检查电梯当前所在的楼层是否有乘客请求。
如果有请求,我们根据电梯的状态和乘客的请求来确定电梯下一步的动作。
如果电梯处于静止状态,我们可以根据乘客的请求来确定电梯的状态。
如果有上升请求,我们将电梯的状态设为上升;如果有下降请求,我们将电梯的状态设为下降。
如果电梯处于上升状态,我们需要找到最接近电梯当前位置且有上升请求的楼层,然后将电梯移动到该楼层。
如果没有找到符合条件的楼层,则将电梯状态设为静止。
如果电梯处于下降状态,我们需要找到最接近电梯当前位置且有下降请求的楼层,然后将电梯移动到该楼层。
如果没有找到符合条件的楼层,则将电梯状态设为静止。
在每一次循环结束时,我们将输出电梯的状态和位置,以及每一层楼的乘客请求状态。
这样可以让用户清楚地了解电梯的运行过程。
通过以上的步骤,我们可以完成一个简单的电梯模拟程序。
当然,实际的电梯系统要复杂得多,包括更多的功能和安全性考虑。
但是通过这个简单的模拟程序,我们可以初步了解电梯的运行原理和编程实现。
总结一下,本文介绍了如何使用C语言编写一个简单的电梯模拟程序。
通过定义电梯的状态和位置,以及乘客的请求状态,我们可以模拟电梯的运行过程。
通过循环判断电梯的状态和乘客的请求,我们可以确定电梯下一步的动作。
最后,我们输出电梯的状态和位置,以及每一层楼的乘客请求状态,以展示电梯的运行过程。
希望本文对读者理解电梯的工作原理和使用C语言实现电梯模拟程序有所帮助。
电梯模拟程序--从设计到实现
电梯模拟程序--从设计到实现电梯模拟程序--从设计到实现 ---结对项⽬开发:张永&吴盈盈 这是⼀个⼤家都很熟悉的题⽬,很多⼈也做过类似的题⽬。
最近博客园最近也发表了很多的关于电梯模拟的程序。
下⾯说⼀下我们⼩组的基本思想。
题⽬拿到后,我们先是讨论了⼀下电梯的整体设想。
对这个题⽬进⾏了粗略的分析。
从⾯向对象的⾓度对问题剖析: 下⾯开始电梯的界⾯设计:界⾯设计涉及到的按钮⽐较多,所以每个按钮的命名必须要符合规范,光变量命名就花费了很长时间,举个例⼦:每个电梯都有左右门,那么为了见名知意,命名规则采⽤“elevator_电梯号_左右门”,⼀号电梯的左门命名为“elevator_ID1_Left”,其他的按钮也都有相应的命名规则,这⾥不⼀⼀的列举了。
为了有⼀个友好的界⾯,在这引⼊了⼀个开关门的特效:先介绍⼀下怎么实现的,以⼀个门为例,C#中Timer控件⽐较好⽤,每个门对应⼀个Timer 控件(就是每隔⼀段时间调⽤⼀个⽅法):/*** @Name: openElevator* @Description: 打开电梯门* @Version: V1.00 (版本号)* @Create Date: 2014-3-16 (创建⽇期)* @Parameters:Panel elevator_ID_Left, Panel elevator_ID_Right,电梯的两个门* @Return: 电梯的状态(开和关)*/public int openElevator(Panel elevator_ID_Left, Panel elevator_ID_Right){elevator_ID_Left.Width = elevator_ID_Left.Width - 1;elevator_ID_Right.Width = elevator_ID_Right.Width - 1;elevator_ID_Right.Location = new System.Drawing.Point(elevator_ID_Right.Location.X + 1, elevator_ID_Right.Location.Y);if (elevator_ID_Left.Width == 10){flag = Number.OPEN;}return flag;}在Timer控件中每隔⼀定的时间就调⽤openElevator⽅法,就实现了开门的动作,关门类似。
仿真电梯4层程序-博图
%M2.0 "电梯向上一层标
志"
符号 "电梯下平层信号/上减速" "电梯向上一层标志" "记录上周期下平层信号的状态"
地址 %I5.7 %M2.0 %M2.2
类型 Bool Bool Bool
注释
网络 9:
符号 "电梯向上一层标志" "楼层号存储字节区" "上行"
网络 10:
地址 %M2.0 %MB30 %Q7.0
34 %M100.1 "初始化标志1"
S
注释
%M100.0 "初始化1阶段"
符号 "初始化 1 阶段" "初始化标志 1" "断开 M100.0flag" "关门到位"
地址 %M100.0 %M100.1 %M12.6 %I5.5
类型 Bool Bool Bool Bool
注释
Totally Integrated Automation Portal
IN
OUT1
%MB30 "楼层号存储字节 区"
类型 Byte Bool
符号 "楼层号存储字节区" "下行第一限位"
网络 8:楼层号变化
地址 %MB30 %I6.2
%I6.2 "下行第一限位"
0
MOVE
EN
ENO
IN
OUT1
%MB30 "楼层号存储字节 区"
类型 Byte Bool
注释
%Q8.1 "初始化完成(准
C语言电梯模拟程序
C语言电梯模拟程序C语言电梯模拟程序一直以来我对电梯很感兴趣,起初认为用C语言不可能实现电梯模拟,需要多线程的支持,因此一直以来也没有想着做。
最近数据结构习题书的这道题引起了我的注意,通过几天的努力终于实现了,先将程序的实现与大家分享出来。
在这个程序关键是处理好电梯运行状态转换与乘客进出的同步进行。
好在题目要求每次输入时要输入下一个乘客到来的时间,使得程序变简单了。
通过一个模拟时钟,根据模拟时钟判断该运行哪个函数。
以下是模拟时钟的代码。
[cpp]view plaincopy1.void DoTime(){2.//此函数用于模拟时钟3.while(1){4.if(Time>MaxTime)5.return;6. TestPeople();//两个始终都会被调用的函数7. Controler();8.struct Activity* p=activity.next;9.if(p==NULL){10. Time=MaxTime;11. }12.if(p&&Time>=p->time){//取出活动队头的,检测定时是否到了13. activity.next=p->next;14. p->fn();15. free(p);16. }17. Time++;18. }19.}在这个先不管TestPeople()、Controler()是什么,其中activity是关键,它是一个链表在链表的头部是计时器时间最小的函数,根据模拟时钟判断是否调用这个函数以及删除这个节点。
以下是Activity的具体定义。
[cpp]view plaincopy1.typedef struct Activity{2.int time;3.void(*fn)(void);4.struct Activity* next;5.}Activity;以及全局变量activity[cpp]view plaincopy1.Activity activity={0,NULL,NULL};下面的代码用于将一个函数加入activity链表,这是根据时钟值从小到大插入activity的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二○一一~二○一二学年第一学期信息科学与工程学院自动化系课程设计报告书姓名:学号:班级:课程名称:微机原理与应用课程设计指导教师:2011年12月19日电梯仿真程序1、设计要求(1). 在 1-- 8楼之间一次可输入多个任意楼层号连续控制电梯按指定楼层号顺序上升与下降.以上过程完成后可重新输入任意楼层号连续控制电梯按指定楼层号顺序上升与下降.只有按ESC键才退出程序返回DOS状态。
例如 : 1-3-5-8-6-4-2-1 (可观察教六楼电梯的实际运行情况)。
(2). 在 1 -- 8 楼之间按任意顺序不连续控制电梯上升与下降. 按一次计算机键盘的上箭头电梯上升一楼,按一次计算机键盘的下箭头电梯下降一楼. (上箭头的ASCII码19H , 下箭头的ASCII码1AH 。
)(3). 在电梯上升与下降过程中,要显示出 1--8 楼之间所要到达的楼层数,同时还要用箭头显示电梯是上升状态还是下降状态。
(4). 电梯运行到指定楼层后,打开电梯门,然后关门继续运行。
(5). 电梯运行时, 在任意时刻遇到紧急情况时应能实时中断电梯运行。
也可以在任意时刻恢复电梯运行。
(按A/a 键模拟中断发生,电梯停止运行。
按B/b 键恢复电梯运行)(6). 在计算机屏幕上将电梯的平面模型改成三维立体模型。
(7). 在电梯旁画一个小方块.这个小方块随电梯上升而上升,下降而下降。
以增加电梯运行时的动感。
(8). 电梯仿真软件运行时,应在计算机屏幕上详细说明其使用方法,以及本软件作者姓名和日期。
2、实验装置IBM-PC3、使用方法及功能介绍①在提示“input the floor(1-8F)(such as 1-3-4-1):”后面输入用户要去的楼层,可从任意楼层开始运行,指定楼层号顺序上升与下降,数字与数字之间用“-”连接,数字范围为1-8。
在一轮运行完以后程序会清空楼层提示后面的数字,用户可再输入要去的楼层,若用户希望停止运行该程序,可以在下一轮开始时在楼层提示后面输入0或非数字键,可返回到DOS②在 1 -- 8 楼之间按任意顺序不连续控制电梯上升与下降. 按一次计算机键盘的上箭头电梯上升一楼,按一次计算机键盘的下箭头电梯下降一楼.③电梯上升与下降过程中,在电梯三维模型的正上方的蓝色矩形框内,提示“now the floor is:”后面显示出当前所要在的楼层数,提示“TO:”后面显示1--8 楼之间所要到达的楼层数,提示“direction:”后面显示上下箭头,代表电梯当前是上升状态还是下降状态。
④在电梯旁有一个小方块。
这个小方块随电梯上升而上升,下降而下降。
增加电梯运行时的动感.。
小方块在一个8层的方框内上下移动,电梯每上升一层,小方块在方框内上升一层,电梯每下降一层,小方块在方框内下降一层。
并且小方块在方框内的位置与电梯当前所在楼层时对应的,例如:若当前电梯运行到第3层,则小方块也位于第三层方框。
为了使用户能更清晰地看到电梯的运行过程,小方块每到一层会停留1S的时间。
电梯运行到指定楼层后,打开电梯门,然后关门继续运行,为了模拟真实的效果,电梯在指定楼层停下,大门依次闭合-半开门-全开门-半开门-闭合。
⑤在 1 -- 8 楼之间按任意顺序不连续控制电梯上升与下降。
按一次计算机键盘的上箭头电梯上升一楼,按一次计算机键盘的下箭头电梯下降一楼。
由于所使用的计算机的某些原因,这里输入“w”上升一楼,输入“s”下降一楼。
电梯的不连续控制只在电梯停在某一层且关上的门之后。
提示是“up or down a floor only vailable when elevator stop(use w or s )”,当用户可以对电梯进行不连续控制时,会出现“~now vailable”的提示。
⑥电梯仿真软件运行时,在计算机屏幕上显示本软件作者姓名“author: Wang Hui Ting”和日期“data: 2011-12-16”。
4、程序的设计思路在主程序的最前面是宏,将具有特定功能的画图代码打包成一个个宏放在住程序的最前面。
有清屏的宏,移光标的宏,写横的宏,写竖的宏,画小方块上升的宏,画小方块下降的宏,画初始小方块的宏,画电梯关门状态的宏,画电梯半开门状态的宏,画电梯全开门状态的宏。
由于这段画图的代码在程序中会经常使用,所将他们编成宏使用起来更方便。
除了主程序外还有一个延时1S的子程序。
开始主程序的运行后,先运行一段初始化程序,然后设置图形显示方式,再显示提示信息以及有关信息,然后再画电梯的三维模型,这样整个初始界面就完成了。
然后再提示信息下,用户输入要去的楼层,判断该字符串的第一个字符的ASCII码是否在1-8范围,如果不是则结束并返回DOS界面,如果是则继续进行下一步程序。
将第1个数字代表的楼层设为当前站X(n),并赋给COUNT(该变量用来记录当前层)。
将下个数字代表的层数设为下一站(如果当前站为最后一站,则重新回到开头提示用户输入信息),将COUNT与下一站X(n+1)相比较,若COUNT 大于下一站,则小方块下降一层,COUNT--,并显示当前层和目标层以及下箭头,一直循环直到相等;若COUNT小于下一站,则小方块上升一层,COUNT++,并显示当前层和目标层以及下箭头,一直循环直到相等;相等时,则电梯大门大门依次闭合-半开门-全开门-半开门-闭合。
大门关上后,调用MOV AH,1 ; INT 16H检测是否有按键按下,若没有键盘按下,则X(n)=X(n+1),读取下一个字符,将该字符所代表的楼层赋给X(n+1),并回到前面检测X(n)是否为最后目标层的程序段。
若有键盘按下,则判断AL的值(该值为输入的字符的ASCII码),若AL为‘w’则小方块上升一层,COUNT++;若AL为‘s’则小方块下降一层,COUNT--;两者最后都回到“X(n)=X(n+1),读取下一个字符,将该字符所代表的楼层赋给X(n+1)”这一步,若AL即不为‘w’也不为‘s’,则直接回到该步骤。
以上是整个程序的大致流程和思路。
5、程序的流程图6、程序清单;-----------------------------------------------------------CLSS MACRO ; 清屏之宏MOV BH,7 ; 卷入行属性,黑底白字,正常显示.MOV AX,0600H ; AH=6 屏幕初始化或上卷.AL=0 整个窗口空白.INT 10H ; CH=左上角行号,CL=左下角列号.ENDM ; DH=右上角行号,DL=右下角列号.;-----------------------------------------------------------GB MACRO ; 移光标之宏MOV BH,00H ; BH=页号DH,DL=行号,列号.MOV AH,02H ; AH=2 置光标位置.INT 10HENDM;------------------------------------------------HENG MACRO X1,Y1,COLOR,X2 ; 写横的宏LOCAL BH1 ; 定义标号MOV CX,X1 ; 起始点横作标-->CXMOV DX,Y1 ; 起始点纵作标-->DXBH1: MOV AH,0CH ; 写象素MOV AL,COLOR ; 设定颜色参数-->ALINT 10HINC CXCMP CX,X2 ; 写至终点横作标为止JNZ BH1ENDM;------------------------------------------------SHU MACRO CX1,CY1,COLOR,CY2 ; 写竖的宏LOCAL BH2 ; 定义标号MOV CX,CX1MOV DX,CY1BH2: MOV AH,0CHMOV AL,COLOR ; AL=(00--0FH)共16种颜色.INT 10HINC DXCMP DX,CY2JNZ BH2ENDM;--------------------------------------UP MACRO N,DX1 ;小方块上升的宏LOCAL UPa,UPb ; 定义标号MOV AL,N ;小方块从N-1层上升至N层MOV CH,30 ;小方块上升一层,并且将下一层的小方块清除MUL CHMOV DX,430SUB DX,AXMOV [DZ],DXADD DX,20MOV DX1,DXUPa: HENG 170,[DZ],05H,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ UPaADD DX,11MOV [DZ],DXADD DX,20MOV DX1,DXUPb: HENG 170,[DZ],00H,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ UPbENDM;---------------------------------------------DOWN MACRO N,DX1 ;小方块下降的宏LOCAL DNa,DNb ; 定义标号MOV AL,N ;小方块从N+1层下降至N层MOV CH,30 ;小方块下降一层,并且将上一层的小方块清除MUL CHMOV DX,430SUB DX,AXMOV [DZ],DXADD DX,20MOV DX1,DXDNa: HENG 170,[DZ],05H,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ DNaSUB DX,49MOV [DZ],DXADD DX,20MOV DX1,DXDNb: HENG 170,[DZ],00H,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ DNbENDM;---------------------------------------------INIT MACRO N,DX1 ;画初始小方块的宏LOCAL BEG ; 定义标号MOV AL,N ;小方块最初停在第N层,表示电梯最初停在第N 层MOV CH,30MUL CHMOV DX,430SUB DX,AXMOV [DZ],DXADD DX,20MOV DX1,DXBEG: HENG 170,[DZ],05H,190 ;画小方块INC [DZ]MOV AX,DX1CMP [DZ],AXJNZ BEGENDM;-------------------------------------------CLOSE MACRO ;画电梯关门状态的宏LOCAL CC ; 定义标号MOV [DZ],220CC: HENG 210,[DZ],09H,370 ;电梯关门INC [DZ]CMP [DZ],420JNZ CCSHU 291,220,02H,420 ;电梯大门缝隙SHU 290,220,02H,420SHU 289,220,02H,420ENDM;---------------------------------------------HALF MACRO ;画电梯半开门状态的宏LOCAL HA ; 定义标号MOV [DZ],221HA: HENG 210,[DZ],09H,250 ;电梯半开门HENG 252,[DZ],07H,328HENG 330,[DZ],09H,370INC [DZ]CMP [DZ],420JNZ HASHU 251,220,02H,420 ;电梯大门缝隙SHU 329,220,02H,420ENDM;---------------------------------------------FULL MACRO ;画电梯全开门状态的宏LOCAL F ; 定义标号MOV [DZ],221F: HENG 210,[DZ],09H,215 ;电梯全开门HENG 217,[DZ],07H,363HENG 365,[DZ],09H,370INC [DZ]CMP [DZ],420JNZ FSHU 216,220,02H,420 ;电梯大门缝隙SHU 364,220,02H,420ENDM;---------------------------------------------DATA SEGMENTMESS DB ' elevator model ' ,0AH,0DH,'$'ME1 DB ' press any key to return DOS.',0AH,0DH,'$' ;当使用者进行非正常操作时,提示使用者手动返回DOSME2 DB ' now the floor is:',0AH,0DH,'$' ;提示当前楼层ME3 DB ' direction: ',0AH,0DH,'$'ME4 DB 'input the floor(1-8F)(such as 1-3-4-1): $' ME5 DB 'author: Wang Hui Ting',0AH,0DH,'$' ; 输出多个空格键是为了清空上一次的输入ME6 DB 'data: 2011-12-16',0AH,0DH,'$'ME7 DB 'TO:',0AH,0DH,'$' ;提示电梯下一站要停的楼层ME8 DB 'up or down a floor,',0AH,0DH,'$' ;提示使用者用上、下键不连续控制电梯ME9 DB 'only vailable when elevator',0AH,0DH,'$' ME10 DB 'stop(use w or s )',0AH,0DH,'$'ME11 DB '~now vailable',0AH,0DH,'$'ME12 DB ' ',0AH,0DH,'$'IBUFF DB 0FFH,0,255 DUP(0)DIDAS EQU 18DZ DW 0TIMES DW 0,0NUM DB 0NUM1 DB 0COUNT DB 0COUNT1 DB 0DX1 DW 3DX2 DW 6DATA ENDS;---------------------------------------STAC SEGMENTSTA DW 100 DUP(0) ; 堆栈段TOP DW ?STAC ENDS;---------------------------------------CODE SEGMENTASSUME CS:CODE,DS:DATA;ES:DATA,SS:DATA;---------------------------------------DELAY1S PROC NEAR ;延时1S的子函数PUSH DX ;压栈PUSH CXXOR AX,AXINT 1AHMOV TIMES,DXMOV TIMES[2],CXread_time:XOR AX,AXINT 1AHSUB DX,TIMESSBB CX,TIMES[2]CMP DX,DIDASJB read_timePOP CX ;出栈POP DXRETDELAY1S ENDP;---------------------------------------START PROC FARMOV AX,DATA ; 主程序MOV DS,AXMOV AX,STACMOV SS,AXMOV AX,DATAMOV ES,AXPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIMOV CX,0MOV DX,2479HMOV BH,7MOV AX,0601HINT 10HMOV AX,0012H ; 置图形显示方式INT 10H ; 640列*480行,16色.MOV DX,0421H ;显示MESSGBMOV DX,OFFSET MESSMOV AH,9INT 21HMOV DX,0432H ;显示ME5GBMOV DX,OFFSET ME5MOV AH,9INT 21HMOV DX,0532H ;显示ME6GBMOV DX,OFFSET ME6MOV AH,9INT 21HMOV DX,0GBMOV [DZ],100SB: HENG 220,[DZ],03,420 ;显示栏INC [DZ]CMP [DZ],150JNZ SBHENG 220,99,0AH,420 ;显示栏边框HENG 220,151,0AH,420SHU 220,99,0AH,151SHU 420,99,0AH,151CLOSE ;电梯大门处于关闭状态HENG 210,220,02H,370 ;电梯大门缝隙边框HENG 210,420,02H,370SHU 210,220,02H,420SHU 370,220,02H,420HENG 209,219,02H,371 ;加粗边框SHU 209,220,02H,420SHU 371,220,02H,420MOV [DZ],219MOV DX1,210MOV DX2,370SB1: HENG DX1,[DZ],03H,DX2 ;三维电梯上侧面DEC [DZ]INC DX1INC DX2CMP [DZ],180JNZ SB1MOV [DZ],371MOV DX1,220MOV DX2,420SB2: SHU [DZ],DX1,03H,DX2 ;三维电梯右侧面INC [DZ]DEC DX1DEC DX2CMP [DZ],410JNZ SB2MOV [DZ],420SB3: HENG 70,[DZ],02H,480;画地平线INC [DZ]CMP [DZ],425JNZ SB3MOV [DZ],421SB4: HENG 160,[DZ],04H,200 ;小方块运行在框架内SUB [DZ],30CMP [DZ],151JNZ SB4SHU 160,180,04H,420SHU 200,180,04H,420MOV DX,071DHGBMOV DX,OFFSET ME2 ;显示ME2MOV AH,9INT 21HMOV DX,081DHGBMOV DX,OFFSET ME3 ;显示ME3MOV AH,9INT 21HMOV DX,082DHGBMOV DX,OFFSET ME7 ;显示ME7MOV AH,9INT 21HSA1s: MOV DX,0202H ;显示ME4GBMOV DX,OFFSET ME4MOV AH,9INT 21HMOV DX,0229HGBMOV DX,OFFSET IBUFF ;输入并显示字符串MOV AH,10INT 21HMOV DX,0402H ;提示使用者用上、下键不连续控制电梯GBMOV DX,OFFSET ME8 ;显示ME8MOV AH,9INT 21HMOV DX,0502HGBMOV DX,OFFSET ME9 ;显示ME9MOV AH,9INT 21HMOV DX,0602HGBMOV DX,OFFSET ME10 ;显示ME10MOV AH,9INT 21HSA1: MOV AL,IBUFF+1MOV COUNT,AL ;记录输入的字符个数MOV BP,2MOV AL,IBUFF[BP]CMP AL,30H ;将首字符与1BH(ESC ASCII码)比较,若相等则返回DOS,这里由于汇编软件的原因改为与0的ASCII码比较JZ WA1CMP AL,30H ;避免当使用者出入其它键是程序进入死循环JB W A0CMP AL,38HJA W A0AND AL,0FHMOV NUM,ALINIT NUM,DX1MOV DX,072FHGBMOV DL,NUM ;显示电梯第一站楼层数OR DL,30H ;将数字转换为字符MOV AH,2INT 21HCALL DELAY1SSA1a: ADD BP,2MOV AL,IBUFF[BP]AND AL,0FH ;将字符转换为数字MOV NUM1,ALMOV DX,0830HGBMOV DL,IBUFF[BP] ;显示电梯下一站要停的楼层数MOV AH,2INT 21HCALL DELAY1SSA1b: MOV AL,NUM1 ;下一站要去的楼层和当前所在楼层相比较CMP AL,NUM ;若下一站楼层大于当前楼层,则小方块上升JA SA1c ;若下一站楼层小于当前楼层,则小方块下降MOV AL,NUM1 ;若下一站楼层等于当前楼层,则小方块不动CMP AL,NUM ;这里有2次比较JZ SA1d ;到达所在楼层后停止运动DEC NUMDOWN NUM,DX1 ;电梯下降MOV DX,0829HGBMOV DL,19H ;显示下箭头MOV AH,2INT 21HMOV DX,072FHGBMOV DL,NUM ;显示当前楼层数OR DL,30H ;将数字转换为字符MOV AH,2INT 21HCALL DELAY1S ;小方块在每一层停止1S可让人更直观地看清电梯的运行状况JMP SA1bSA1c: INC NUMUP NUM,DX1 ;电梯上升MOV DX,0829HGBMOV DL,18H ;显示上箭头MOV AH,2INT 21HMOV DX,072FHGBMOV DL,NUM ;显示当前楼层数OR DL,30H ;将数字转换为字符MOV AH,2INT 21HCALL DELAY1SJMP SA1bSA1d: HALF ;电梯在指定楼层停下,大门依次从闭合-半开门-全开门-半开门-全开门CALL DELAY1SFULLCALL DELAY1SHALFCALL DELAY1SCLOSECALL DELAY1SMOV DX,0702HGBMOV DX,OFFSET ME11 ;显示ME11,表明现在可以进行不连续控制MOV AH,9INT 21HXOR AX,AXINT 1AHMOV TIMES,DXMOV TIMES[2],CXread_time1:CLCMOV AH,1 ;输入上、下键INT 16HJNZ getXOR AX,AXINT 1AHSUB DX,TIMESSBB CX,TIMES[2]CMP DX,DIDASJB read_time1JMP show1get: CMP AL,'w'JZ ups1CMP AL,'s'JZ downs1JMP SA1eups1: INC NUMUP NUM,DX1 ;电梯上升一层JMP showdowns1: DEC NUMDOWN NUM,DX1 ;电梯下降show: MOV DX,072FHGBMOV DL,NUM ;显示当前楼层数OR DL,30H ;将数字转换为字符MOV AH,2INT 21HMOV AH,0CHINT 21H ;清空键盘缓冲区show1: MOV DX,0702HGBMOV DX,OFFSET ME12 ;显示ME12,表明现在不可以进行不连续控制MOV AH,9INT 21HSA1e: MOV AL,COUNT;电梯向下一站运行CBWCMP BP,AXJB SA1aJMP SA1s ;电梯重新进行新的一轮的运行WA0: MOV DX,1834H ;显示ME1 GBMOV DX,OFFSET ME1MOV AH,9INT 21HMOV DL,0FFHMOV AH,6INT 21HJZ WA0MOV CX,0MOV DX,2479HCLSSWA1: MOV AX,4C00HINT 21H ; 返回DOS.MOV AH,02HINT 10H ; 恢复文本显示方式.POP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETSTART ENDP;---------------------------------------CODE ENDSEND START7、运行结果及界面图1 初始界面图2 电梯半开门状态下的界面图2 电梯全开门状态下的界面8、设计小结在这之前,对汇编程序设计是有点恐惧的,毕竟汇编语言不像C语言或C++那样可读性强,而且调试起来困难很大,需要注意的细节很多,单单赋值指令很多时候会出错,因为使用时要严格按照汇编的格式来。