PLC计数器如何计脉冲

PLC计数器如何计脉冲,第1张

用高速计数器计数,配专用的中判IO脉冲输入点,如西门子200的I0.0和I0.1,他们档型即可以做普通输入点也可以做脉冲输入点。最大脉冲卖蠢改频率为100M

Hz。

如果想接更多路就要配专用脉冲模块了。

我建议你先监梁知视一下,我看你这个C251根本没有计数。C251是双向双脉冲高速橡正消计数器,是感受清誉X0和X1的AB相脉冲来计数的,和普通的C0什么的前面用内部触点计数是不一样的。高速计数器是不能用前面加一个触点控制计数个数的。你这个程序C251根本不会计数。

望采纳。。。。。

大体模块如没迅下,以前用过的,你再改一改就可以了、、、、

1. 分频模块

由于实验箱上没有14hz和13hz的整数倍时钟信号,因此采用频率较大的750khz进行分频,以近似得到14hz,13hz和1hz的时钟频率。通过以上三种不同频率的脉冲信号实行出租车行孙皮驶,等待两种情况下的不同计费。模块元件如下:

分频模块框图

源程序如下:

Library IEEE

use IEEE.std_logic_1164.all

use IEEE.std_logic_arith.all

use IEEE.std_logic_unsigned.all

entity fenpin is

port(clk_750k:in std_logic--系统时钟

clk_14:buffer std_logic --14分频

clk_13:buffer std_logic --13分频

clk_1 : buffer std_logic) --1分频

end fenpin

architecture rt1 of fenpin is

signal q_14:integer range 0 to 53570--定义中间信号量

signal q_13:integer range 0 to 57691

signal q_1:integer range 0 to 749999

begin

process(clk_750k)

begin

If(clk_750k' event and clk_750k='1')then

If q_14=53570 then q_14<=0clk_14<=not clk_14

else q_14<=q_14+1

end if --得14hz频率信号

If q_13=57691 then q_13<=0clk_13<=not clk_13

else q_13<=q_13+1

end if --得13hz频率信号

If q_1=749999 then q_1<=0clk_1<=not clk_1

else q_1<=q_1+1

end if --得1hz频率信号

end if

end process

end rt1;

2. 计量模块

计量模块主枯凯此要完成计时和计程功能。

计时部分:计算乘客的等待累积时间,当等待时间大于2min时,本模块中en1使能信号变为1;当clk1每来一个上升沿,计时器就自增1,计时器的量程为59min,满量程后自动归零。

计程部分:计算乘客所行驶的公里数,当行驶里程大于2km时,本模块中en0使能信号变为1;当clk每来一个上升沿,计程器就自增1,计程器的量程为99km,满量程后自动归零。

元件框图为:

计量模块框图

计量模块仿真波形为:

源程序如下:

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_arith.all

use ieee.std_logic_unsigned.all

entity jiliang is

port(start:in std_logic --计费开始信号

fin:in std_logic --里程脉冲信号

stop:in std_logic--行驶中途等待信号

clk1:in std_logic--驱动脉冲

en1,en0:buffer std_logic --计费单价使能信号

k1,k0:buffer std_logic_vector(3 downto 0) --行驶公里计数

m1,m0:buffer std_logic_vector(3 downto 0))--等待时间计数

end jiliang

architecture rt2 of jiliang is

signal w:integer range 0 to 59 --计时范围0~59

begin

process(clk1)

begin

if(clk1'event and clk1='1')then

if start='0' then

w<=0en1<='0'en0<='0'm1<="0000"

m0<="0000"k1<="0000"k0<="0000"

elsif stop='1' then --计时开始信号

if w=59 then

w<=0

else w<=w+1

end if

if m0="1001" then

m0<="0000"

if m1="0101" then

m1<="0000"

else m1<=m1+1

end if

else m0<=m0+1

end if

if stop='1' then en0<='0'

if m1&m0>"00000001" then en1<='1' --若等待时间大于2min则en1置1

else en1<='0'

end if

end if

elsif fin='1' then --里程计数开始

if k0="1001" then k0<="0000"

if k1="1001" then k1<="0000"--计程范围0~99

else k1<=k1+1

end if

else k0<=k0+1

end if

if stop='0' then

en1<='0'

if k1&k0>"00000001" then

en0<='1' --若行使里程大于2km,则en0置1

else en0<='0'

end if

end if

end if

end if

end process

end rt2

3. 控制模块

本模块主要是通过计量模块产生的两个不同的输入使能信号en0,en1,对每个分频模块输出的14hz,13hz的脉冲进行选择输出的过程;本模块实现了双脉冲的二选一;最终目的为了计费模块中对行驶过程中不同的时段进行计价。

模块元件如下:

控制模块框图

控制模块仿真波形为:

源程序如下:

Library IEEE

use IEEE.std_logic_1164.all

use IEEE.std_logic_arith.all

use IEEE.std_logic_unsigned.all

entity kongzhi is

port(en0,en1:in std_logic --使能选择信号

clk_in1:in std_logic --14分频输入信号

clk_in2:in std_logic --13分频输入信号

clk_out:out std_logic) --输出信号

end kongzhi

architecture rt3 of kongzhi is

begin

process(en0,en1)

begin

if en0='1' then --实现二选一功能

clk_out<=clk_in1

elsif en1='1' then

clk_out<=clk_in2

end if

end process

end rt3

4.计费模块

当计费信号start一直处于高电平即计费状态时,本模块根据控制模块选择出的信号从而对不同的单价时段进行计费。即行程在2km内,而且等待累计时间小于2min则为起步价5元;2km外以每公里1.4.元计费,等待累积时间超过2min则按每分钟1.3元计费。c0,c1,c2,c3分别表示费用的显示。

模块元件为:

计费模块框图

计费模块仿真波形为:

源程序如下:

Library IEEE

use IEEE.std_logic_1164.all

use IEEE.std_logic_arith.all

use IEEE.std_logic_unsigned.all

entity jifei is

port(clk2:in std_logic --计费驱动信号

start:in std_logic --计费开始信号

c0,c1,c2,c3:buffer std_logic_vector(3 downto 0))

end jifei

architecture rt4 of jifei is

begin

process(clk2,start)

begin

if start='0'then c3<="0000"c2<="0000"c1<="0101"c0<="0000"--起步价5元

elsif clk2'event and clk2='1'then

if c0="1001" then c0<="0000"

if c1="1001" then c1<="0000"

if c2="1001" then c2<="0000"

if c3="1001" then c3<="0000"--计价范围0~999.9

else c3<=c3+1

end if

else c2<=c2+1

end if

else c1<=c1+1

end if

else c0<=c0+1

end if

end if

end process

end rt4

5.显示模块

显示模块完成计价,计时和计程数据显示。计费数据送入显示模块进行译码,最后送至以百元,十元,元,角为单位对应的数码管上显示。计时数据送入显示模块进行译码,最后送至以分为单位对应的数码管上显示。计程数据送入显示模块进行译码,最后送至以km为单位的数码管上显示。

模块元件为:

显示模块框图

源程序如下:

library ieee

use ieee.std_logic_1164.all

use ieee.std_logic_unsigned.all--定义库包

entity xianshi is --定义实体

port(

clk_scan:in std_logic--扫描时钟信号端口设置

c3,c2,c1,c0:in std_logic_vector(3 downto 0)--总费用输入端口

k0,k1:in std_logic_vector(3 downto 0)--里程输入端口

m0,m1:in std_logic_vector(3 downto 0)--等待时间输入端口

sel:out std_logic_vector(2 downto 0)--控制数码管位选信号的扫描信号输出端口

led:out std_logic_vector(6 downto 0)--数码管的控制端口

led_dp:out std_logic --数码管的小数点输出端口

)

end xianshi

architecture rt5 of xianshi is

signal duan:std_logic_vector(6 downto 0)--数码显示管中间变量

signal shuju:std_logic_vector(3 downto 0)--选择输入端的中间变量

signal cnt:std_logic_vector(2 downto 0)--控制数码管的中间变量

signal xiaodian:std_logic--小数点的中间变量

begin

process(clk_scan) --开始进程

begin

if clk_scan'event and clk_scan='1' then

cnt<=cnt+1--每有一个扫描信号上升沿实现加1扫描

end if

end process--结束进程

process(cnt) --开始进程(选择扫描显示数码管)

begin

case cnt is --扫描时给每个数码管赋值

when "000"=>shuju<=c0

when "001"=>shuju<=c1

when "010"=>shuju<=c2

when "011"=>shuju<=c3

when "100"=>shuju<=k0

when "101"=>shuju<=k1

when "110"=>shuju<=m0

when "111"=>shuju<=m1

when others=>null

end case

if (cnt="001" or cnt="110")

then xiaodian<='1'--在里程和总费用的个位处显示小数点

else xiaodian<='0'

end if

end process--结束进程

process(shuju) --开始进程(译码显示)

begin

case shuju is

when "0000"=>duan<="0111111"--0

when "0001"=>duan<="0000110"--1

when "0010"=>duan<="1011011"--2

when "0011"=>duan<="1001111"--3

when "0100"=>duan<="1100110"--4

when "0101"=>duan<="1101101"--5

when "0110"=>duan<="1111101"--6

when "0111"=>duan<="0000111"--7

when "1000"=>duan<="1111111"--8

when "1001"=>duan<="1101111"--9

when others=>null

end case

end process

sel<=cnt

led<=duan

led_dp<=xiaodian

end rt5


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12482484.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存