变量使用 篇1
电子电路技术更新换代的周期很快, 新技术的发明与应用所需时间很短, 集成电路技术也在发生着日新月异的变化, 在这样的背景下, 传统的芯片设计技术和系统集成技术已经不能适应新的标准要求。因此, 必须要尽快提高设计效率, 要想提高设计效率必须要降低设计难度, VHDL设计方法能够在很大程度上降低芯片和系统集成的设计难度。电子设计自动化技术是现代电子设计的重要技术, 高速集成电路硬件描述语言是EDA的重要工具。
1 关于数据对象的简介
在VHDL语言要素中, 数据对象是比较重要的内容, 一般都包含如下三类:常量、变量和信号。
常量是一个全局量, 它的定义和设置主要是为了使程序更容易阅读和修改, 在程序中, 常量作为一个固定不变的稳定值, 不可以被改变。
变量相对于常量来说, 算是一个局部量, 变量主要是在局部程序的某个进程或子程序中使用。变量一般不可以超出自身所在的程序结构, 其信息的传输也离不开程序结构对其所做的定义和赋值, 在实际工作过程中, 不会出现延时暂停的状况, 工作具有即发性。
信号是一种比较特殊的数据对象, 作为在VHDL中的一个全局量, 通常是在程序包说明、实体说明和结构体描述中使用。信号与连接线比较类似, 通过基本数据来描述硬件系统, 信号可以充当并行语句模块间的信息交流通道。
2 信号与变量的定义位置与赋值范围
在VHDL中, 定义变量的一般表述是:variable变量名:数据类型:=初始值。变量限于自身的属性, 作为局部量, 其能够适用的范围很小, 通常情况下仅限于定义了变量的进程或子程序的顺序语句中。变量不能将信息带出对它作出定义的当前结构中。在这些语句结构中, 同一变量的值将随变量的赋值语句前后顺序的运算而改变。变量的赋值其实从技术角度来看, 本身是一种十分理想的数据传输模式, 这种工作时瞬间发生, 不会有暂停或迟滞现象发生。
变量定义语句中的初始值可以是一个与变量具有相同数据类型的常数值, 这个表达式的数据类型必须与所赋值的变量一致。
变量的主要作用是在进程中作为临时的数据存储单元。
变量赋值的一般表述为:目标变量名:=表达式;
信号定义的语句格式与变量相似, 信号定义也可以设置初始值。
定义信号的一般表述是:Signal信号名:数据类型:=初始值
信号赋值语句表达式为:目标信号名〈=表达式;
赋值语句中的表达式可以是一个运算表达式, 也可以是数据对象 (常量、变量、信号) 。数据信息的传入可以设置延时量。所以目标信号获得传入的数据并不是即时的。即使不作任何的延时设置, 也要经历一个特定的延时。因此, 由于器件的延迟特性, 符号“〈=”两边的数值并不是一致的。
所以, 两者赋值位置与范围不同, 主要体现在三个方面: (1) 基本用法:信号用于作为电路中的信号连线;变量用于作为进程中局部数据存储单元。 (2) 适用范围:信号适用于整个结构体的任何地方;变量只能适用于所定义的进程中。 (3) 行为特性:信号在进程的最后才对信号赋值;变量是立即赋值的。
但也有相同之处, 主要体现在两方面: (1) 在设计不准确、不完整的计算机条件语句中, 变量与信号在经综合后一般均可以存入寄存器, 这样也可产生基本相同的逻辑电路。 (2) 初始值的功效相同。从技术角度来看, 没有必须明确要求变量和信号定义的初始值, 如果对其进行改变或设置, 可能会导致综合后的硬件电路不支持。
3 实际案例分析
例二:
从上面两个例子的结构可以看出, 设计者的用意是想要设计一个4选1多路选择器, 对应的电路理应是一个纯组合电路, 其中的a和b是通道选通的控制信号。例一与例二的主要不同在于, 例一中将标识符muxval定义为信号, 而例二中将其定义为变量。结果综合出了完全不同的电路。综合后的电路图如图1和图2所示。可以从电路图中看出, 图1中含有时序电路, 而图2是纯组合电路。
例一中, 信号muxval在进程中出现了三次赋值操作, 即有三个赋值源:muxval<=0、muxval<=muxval+1和muxval<=muxval+2, 但根据进程中信号的赋值规则, 前两个赋值语句中的赋值目标信号muxval都不可能得到更新, 只有最后的muxval<=muxval+2语句中的muxval的值得到了更新, 所以传输符号右边的muxval并未得到任何确定的初值, 即并未执行语句muxval<=0, 结果只能被综合成随b和a变动的时序电路, 导致左边的muxval也是一个不确定的信号。结果在进程最后的CASE语句中, 无法通过判断muxval的值来确定选通输入, 及对q的赋值。
例一和例二就有所不同了, 程序中首先将muxval定义为变量, 根据变量顺序赋值以及暂存数据的规则, 首先执行了语句muxval:=0, 从而使两个if语句中的muxval都能得到确定的初值。另一方面, 当if语句不满足条件时, 即当a或b不等于1时, 由于muxval已经在第一条赋值语句中被更新为确定的值, 即0了, 所以尽管两个if语句从表面上看都属于不完整的条件语句, 但都不可能被综合成时序电路了, 显然从图2可以看到一个纯组合电路。
4 结论
本文首先通过描述和比较, 总结了信号和变量在定义和赋值范围上的不同与相同, 然后经过程序和综合结果的比较, 总结了变量与信号的其他区别, 可以看出, 若是信号和变量定义不够精确和完整, 很容易给设计结果造成损失, 综合的电路也会完全不同。因此, 技术人员在用VHDL语言设计芯片或集成电路的程序时, 要确保信号和变量的恰当、正确使用, 在VHDL语言设计中, 要能够熟练准确地使用信号或变量的系统默认值, 尽可能地灵活实现设计的目标。
摘要:VHDL语言是现代电子设计的重要工具。数据对象是其中的重要语言要素, 通常由常量、变量与信号等组成, 一般情况下, 这些要素在经过综合后可以引入寄存器, 这样就能够产生相同的逻辑电路, 与初始值的功效基本相同。语言要素中的常量和变量可以从计算机语言中找到与其对应的数据类型, 并且这类常量和变量的语言行为与高级中的变量和常量基本相同。比较特殊的要素是信号, 它的数据对象包含更多的硬件特征, 这也是VHDL中最有特色的语言要素之一。本论文讲述的是常量和变量的相似之处, 还有变量和信号的相同与不同之处, 主要表现为定义位置、适用范围、延时行为特性等, 并以实例加以验证。
关键词:VHDL,变量,信号
参考文献
[1]潘松, 黄继业.EDA技术实用教程[M].北京:科学出版社, 2005.
[2]曾繁泰.EDA工程的理论与实践[M].北京:电子工业出版社, 2004.
[3]徐惠民.数字逻辑设计与VHDL描述[M].北京:机械工业出版社, 2004.
[4]江国强编著.EDA技术与应用[M].北京:电子工业出版社, 2004.
[5]姜立东等编著.VHDL语言程序设计及应用第二版[M].2004年06月.
变量使用 篇2
【摘 要】施耐德Premium系列PLC在我国自动化行业的使用十分广泛,明确定位变量和非定位变量的使用范围对控制系统的安全稳定运行至关重要。本文通过对施耐德Premium系列PLC中定位变量与非定位变量的分析,结合其在糯扎渡电厂机组技术供水控制系统中的应用,提出了关于定位变量和非定位变量的使用范围以供参考。
【关键词】PLC;定位变量;非定位变量
0.引言
糯扎渡水电站位于云南省思茅县与澜沧县交界处的澜沧江下游干流上,系澜沧江中下游河段规划八个梯级中的第五级。糯扎渡水电站是澜沧江上一个以发电为主,同时兼顾防洪、改善下游航运、渔业、旅游和环保作用并对下游电站起补偿作用的特大型水电工程,水库具有多年调节能力。
糯扎渡水电站为地下厂房,电站装机容量5850MW,装机9台,单机容量650MW。电站以500kV电压等级接入电力系统,在系统中担任调峰、调频和事故备用。电站按无人值班(少人值守)设计。
机组技术供水中的冷却水对电站机组的安全运行起着至关重要的作用,冷却水运行不正常,会造成机组温度升高,报警、甚至事故停机。在机组运行的3个月内,出现3次因机组技术供水控制系统参数丢失导致机组技术供水冷却水中断。因此,提高控制系统的可靠性刻不容缓。
1.机组技术供水系统配置及控制要求
1.1系统配置
糯扎渡电厂机组技术供水采用单元供水方式,全厂共配置9套机组技术供水控制系统,每台机组1套,每套设有2台水泵。机组技术供水控制系统设有1块控制盘和2块启动盘,每套机组技术供水控制系统使用施耐德Premium系列PLC作为核心控制元件。
1.2控制要求
(1)机组技术供水采用单元供水方式,设有水泵供水和顶盖取水两种供水方式。
(2)水泵供水设有两路,均取自尾水管,两路取水分别经供水泵、自动滤水器后向机组供水。顶盖取水通过电动三通阀切换实现向机组供水或向尾水排水。
(3)顶盖取水总管上设有一个压力变送器,用于监视顶盖取水压力,在顶盖取水管路上设有安全阀,若出现水压过高,安全阀自动打开排水并报警。
(4)每台机技术供水总管上装有一个电磁流量计和一个压力变送器,用于监视和控制,供水总管上装有一个温度变送器。
(5)流量信号和压力信号、温度信号除参与水泵控制和现地显示。
(6)顶盖取水方式需在电站机组投产后进行试验,若试验成功,则将顶盖取水作为主供水方式,另外两路水泵供水作为备用水源。若顶盖取水不成功,则两路水泵供水设为一主、一备,且互为备用。
(7)冷却水系统设有反冲功能,反冲时现地手动、远方手动或自动控制电动四通切换阀,实现进出水的换向。反冲完成后恢复正向供水。
(8)机组开机时,以顶盖取水作为主供水源时,开机前确认电动三通阀位置,若在供水位置,可发开机指令,根据冷却水出水管路上的流量开关是否有水流进行判断,若有水流则继续开机流程。以一路水泵供水作为主供水源时,开机前发送信号启动主供水源上的水泵,判断冷却水出水管路上的流量传感器水流信号再发开机指令。
(9)当以顶盖取水作为主水源时,三通阀处于供水位置,若供水总管上的压力变送器发出压力过低信号时,启动水泵供水方式的一路水泵并报警,同时将顶盖取水管路上的三通切换阀自动切换至排水位置。当以一路水泵供水作为主水源时,若供水总管上的压力变送器发出压力过低信号时,自动启动备用水泵供水管路上的水泵并报警,三通阀处于排水位置。
(10)机组停机时,先发停机指令,机组停止运转后再自动关闭开启的水泵,从而切断机组技术供水。顶盖取水方式时,无阀门启闭操作。
2.PLC硬件配置及重要控制逻辑
2.1硬件配置
2.2重要控制逻辑
定位变量:DI[43](%M43)三通阀远控方式
定位变量:DI[50](%M50)导叶空载态以下
定位变量:DI[58](%M58)顶盖取水方式
定位变量:DI[59](%M59)水泵供水方式
非定位变量:KJL:开机令
非定位变量:TJL:停机令
非定位变量:Start_Pump_Num:系统需要启动水泵台数
非定位变量:Pump_Running_Num:当前运行水泵台数
非定位变量:Start_Pump:启动水泵流程
非定位变量:Stop_Pump:停止水泵流程
3.原因分析
3.1故障前技术供水运行方式
1号供水泵控制方式在“自动”位,2号水泵控制方式在“自动”位,监控系统发出机组自动开机令,启动开机流程,流程启动机组技术供水。
3.2故障现象
现场 2号供水泵运行时间为5天,达到时间切换条件,机组技术供水控制系统停止2号供水泵,延时5s启动 1号供水泵。2号供水泵正常停止,1号供水泵未自动启动,1、2号供水泵切换失败。
3.3原因分析
(A)运行人员现地检查未发现异常报警,随后点击触摸屏“手动启泵”软按钮,1号泵未自动运行,手动启动 1 号泵运行正常。
结论:手动启动1号供水泵硬回路正常。
(B)使用调试机连接控制系统PLC,通过动态数据表监视非定位变量Start_Pump_Num,参数为0。
结论:Start_Pump_Num参数丢失(机组技术供水控制系统未接到停止命令之前,该参数应保持为1)。
(C)查阅施耐德Unity pro编程手册,确认定位变量与非定位变量使用注意事项。
结论:非定位变量,不带硬件地址的标签名称,不能周期设定,适合存储临时数值或逻辑运算的中间结果,如果在项目中需要周期设定变量,使用定位变量;定位变量,带硬件地址的标签名称 (静态 RAM),适合存储重要参数。
3.4结论
在未发停机令的工况下,系统需要启动水泵台数Start_Pump_Num须长期保持为1,实际值为0,参数丢失,且程序中Start_Pump_Num为非定位变量。根据施耐德Unity pro编程手册中关于定位变量与非定位变量使用注意事项,将Start_Pump_Num由非定位变量改为定位变量,即对该参数明确地址。
4.整改措施
通过查看程序中未使用的数据存储区,确定对Start_Pump_Num赋予地址为%MW200,数据类型:INT。
5.结束语
糯扎渡电厂机组技术供水控制程序自2012年10月20日改造、调试完毕,正式投入使用近一年来,机组技术供水系统运行稳定,未发生因参数丢失导致1、2号供水泵自动切换失败而影响机组安全稳定运行的不安全事件。真正找到了导致该系统运行不稳定的根本原因,提高了水轮发电机安全稳定运行系数。同时,也真正掌握了施耐德Premium系列PLC中定位变量与非定位变量的使用范围,为降低广大施耐德Premium系列PLC用户安全风险奠定坚实基础。 [科]
【参考文献】
[1]UnityPremium&Atrium;硬件参考手册.
Shell中的变量使用小结 篇3
变量的定义,只能以字母和下划线开始,区分大小写,可以包含数字 字母下划线.详见官方手册
代码如下:
[root@svn shell_example]# yourname=‘Linux‘
[root@svn shell_example]# echo $yourname
Linux
[root@svn shell_example]# YourName=“linux”
[root@svn shell_example]# echo “The variable is $YourName”
The variable is linux
获取当前日期的脚本,常用在日志切割中,为了区分每天的日志文件
如下生成4月27日
代码如下:
[root@svn shell_example]# echo `date +%Y%m%d`
0427
[root@svn shell_example]# cat today.sh
#!/bin/bash
TODAY=`date +%A`
YEAR=`date +%Y年%m月%d日`
echo “今天是 $YEAR, $TODAY”
[root@svn shell_example]# sh today.sh
今天是 月27日, 星期一
从键盘获取用户的输入,如下脚本执行后脚本直接等待用过户输入,直到用户输入完成 并回车,脚本获取到用户的输入并将结果打印出来.
代码如下:
[root@svn shell_example]# cat var.sh
#!/bin/bash
read myvar
echo “myvar is $myvar
执行结果如下
[root@svn shell_example]# sh var.sh
Linux
myvar is Linux
[/code]
带提示信息的从键盘获取用户输入
代码如下:
#!/bin/bash
#从键盘获取用户信息,并打印出来.
echo -n‘Enter Your Name:‘#-n 选项表示不换行.
read name
echo ”Hi $name“
sh name.sh
Enter Your Name:linux
Hi linux
升级版脚本,此脚本成功的接受了用户的2个参数 姓和名字,并将输入打印在屏幕上
代码内容如下
代码如下:
[root@svn shell_example]# cat firstname.sh
#!/bin/bash
pw=”123“
echo
echo ”+========用户登录=========+“
echo
echo -n”请输入您的用户名: “
read fname lname
echo -n”请输入您的密码: “
read passwd
echo ”尊敬的会员$fname $lname,您好!您已登录成功“
[root@svn shell_example]# sh firstname.sh
+========用户登录=========+
请输入您的用户名: 纳斯 李
请输入您的密码: 123