I/O点数

2024-08-05

I/O点数 篇1

一、输入点数的扩展

1. 分组分时输入

在手动和自动兼需的可编程控制系统中, 显然手动程序和自动程序不会同时执行, 故可把手动和自动的输入信号组合起来, 按不同控制状态的要求输入可编程控制器, 使其既能实现自动又能完成手动控制, 如图1所示。

对有些联锁的处理, 如果PLC内部不采集该触点信号的状态, 可在外部进行硬件联锁, 不必每一个开关量都接到PLC的输入端, 也可以节约一些I/O点。

2. 简化外部连接

此法常用于电机的多地启、停控制, 某台电动机三地启、停控制接线如图2所示, 其中SB1、SB2、SB3为启动按钮, SB11、SB12、SB13为停止按钮。

3. 用中间继电器实现

如图3所示, 当第一次按下X0时, 输出线圈Y0通电, 并通过中间继电器常闭触点自保, 当松开X0时, 输出线圈Y1通电, 并通过中间继电器常开触点自保;当第二次按下X0时, 输出线圈Y0失电, 输出线圈Y1通过触点Y1自保, 当第二次松开按钮X0, 输出线圈Y1断电, 从而实现一点两用。

4. 用计数器实现

电路如图4所示, 按钮X000是常开触点, 当第一次按下时, 上升沿微分输出一方面驱动辅助继电器M100 (一个扫描周期) , 使Y000线圈通电并自锁, 另一方面使计数器C400减1 (计数常数为2) ;当第二次按下X000时, 上升沿微分输出又使C400再减1, 则C400的常闭触点使Y000断电, 使外部负载停止工作, 同时C400的常开触点又使计数器C400清零, 为下一次做好准备。

5. 用微分脉冲指令实现

该方法如图5所示, 当第一次按下X000时, 辅助继电器M0接通一个扫描周期, 其常开触点接通辅助继电器M2, 常开触点M2闭合一个扫描周期, 在SET指令的作用下, 辅助继电器M1接通, 常开触点M1接通输出继电器Y000, 使外部负载启动。当第二次按下X000时, 常开触点M0接通辅助继电器M3一个扫描周期, 常开触点M3闭合, 在复位指令的作用下, 输出继电器Y000断开, 从而使外部负载停止。

6. 用定时器实现

用定时器实现一点两用 (见图6) , 当第一次按下X400时, 输出线圈Y000置位接通, 则Y000的触点使定时器T0启动 (定时1s) , 当时间到, 常闭触点T0断开;当第二次按下X400时, 则X400和T0均接通, 在复位指令RST的作用下, 输出线圈Y000断电, 使外部负载停止工作。

7. 用移位寄存器实现

图7中, 按钮接在X000端, 当按钮第一次按下时, X000的两个触点同时接通移位寄存器的数据输入端和移位输入端, 使M200为“1”状态, 并立即移位到M201, 使M201为“1”, M201的常开触点闭合使输出线圈Y000接通, 外部负载工作;当第二次接通X000时, 由于M201的常闭触点封锁第二次信号输入, 于是移位信号将M201的“0”态移到M201, 使M201为“0”, 其常开触点M201切断了Y000的输出, 停止负载工作。如此循环, 则Y000接通与断开是由按钮按下的次数决定的, 奇数接通, 偶数断开。

二、输出点数的扩展

1. 减少所需PLC的输出点

将系统运行过程中工作状态完全相同的执行元件并联, 注意负载总功率不能超出单个输出点的允许负载能力, 如图8所示。

2. 输出点扩展

PLC输出点数的扩展如图9所示, 即将机上原有的输出触点一半接在行线上, 另一半接在列线上, 当PLC行线上的输出触点接通时, 即接通PLC电源的“+”端, 列线上的输出触点接通时, 即接通PLC电源的“-”端, 可见只要在每条行线和列线之间跨接一个继电器, 就可以得到一组新的输出触点。图9是采用FXON型PLC的六个输出触点, Y000、Y001和Y002接在行线上, Y003、Y004和Y005接在列线上, 这样可得到九个输出触点。

三、结束语

上述几种扩展I/O点的方法在不同品牌的PLC中实现途径略有不同, 但基本思路是一样的。总之, 在工程实践中, 在设计和使用PLC时, 遇到输入、输出点不足时, 合理地使用这些方法, 可以减少I/O点使用数量, 有效提高I/O点利用率, 减少PLC的冗余, 降低成本, 同时又能满足工业控制的要求。

摘要:介绍几种实用的I/O点数扩展方法, 从而提高I/O点数的利用率, 实现小容量PLC控制较大系统或多套系统的目的。

关键词:可编程控制器,I/O点数,扩展

参考文献

[1]高鸿斌.西门子PLC与工业控制网络应用[M].北京:电子工业出版社, 2006.

[2]禹恒州.扩展PLC的I/O点探讨[J].可编程控制器与自动化, 2006 (9) .

串行通信与重叠I/O 篇2

关键词:串行通信;RS232;重叠;I/O;Win API

中图分类号:TN914文献标识码:A文章编号:1007-9599 (2010) 06-0000-02

Serial Communication and Overlapping I/O

Yu Lu,Li Qing

(PLA 91550 Troop,Dalian116023,China)

Abstract:The serial communication to facilitate easy,widely used in both military and civilian.In combination with the hardware described in detail in the Windows environment,use the Win API for asynchronous serial communication method.

Keywords:Serial communication;RS232;Overlap;I/O;Win API

一、前言

串行通讯在通讯领域被广泛应用,标准的RS232接口已成为计算机、计算机外设、交换机和许多通讯设备的标准接口。微机与微机、微机与外设、微机与程控交换机等都可以通过RS232接口进行方便的连接,以实现控制外设和传输数据等目的。

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。笔者在实际工作中积累了一些经验,现结合硬件、软件,及需要注意的要点作一番探讨。希望对各位需要编写串口通信程序的朋友有一些帮助。

二、RS232串口标准

EIA-RS-232是美国电子工业协会正式公布的串行总线标准,也是目前最常用的串行接口标准。该标准规定:直接连接的最大物理距离为15m,通讯速率低于20kbps。

由于RS232并未定义连接器的物理特性,因此,出现了DB-25、DB-15和DB-9各种类型的连接器,其引脚的定义也各不相同。表1介绍了其中两种连接器(DB-25,DB-9)。

RS232标准接口有25条线,4条数据线、11条控制线、3条定时线、7条备用和未定义线,但常用的只有9根。

目前较为常用9针串口和25针串口,当通信距离较近时,可以用电缆线直接连接,若距离较远,须附加Modem。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连。表2列举了RS232串口通信接线方法。

EIA-RS-232对电气特性、逻辑电平和各种信号线功能都作了规定。

在TxD和RxD上:

逻辑1(MARK)=-3V~-15V。

逻辑0(SPACE)=+3V~+15V。

在RTS、CTS、DSR、DTR和DCD等控制线上:

信号有效:(接通,ON状态,正电压)=+3V~+15V。

信号无效:(断开,OFF状态,负电压)=-3V~-15V。

三、Win32串口应用程序

(一)打开串口

Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的声明为:HANDLE CreateFile(LPCTSTR lpFileName,//文件名DWORD dwDesiredAccess,//访问模式DWORD dwShareMode,//共享模式LPSECURITY_ATTRIBUTES lpSecurityAttributes,//通常为NULL

DWORD dwCreationDistribution,//创建方式

DWORD dwFlagsAndAttributes,//文件属性和标志

HANDLE hTemplateFile // 临时文件的句柄,通常为NULL

);

如果调用成功,那么该函数返回文件的句柄,如果调用失败,则函数返回INVALID_HANDLE_VALUE。

(二)串口配置和串口属性

在打开通信设备句柄后,常常需要对串口进行一些初始化工作。这需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、每个字符的数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。

调用GetCommState函数可以获得串口的配置,该函数把当前配置填充到一个DCB结构中。一般在用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置。要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数用指定的DCB结构来设置串口。

除了在DCB中的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区来暂存串口输入和输出的数据,如果通信的速率较高,则应该设置较大的缓冲区。调用SetupComm函数可以设置串口的输入和输出缓冲区的大小。

(三)串口读写

在用ReadFile和WriteFile读写串口时,既可以同步执行,也可以重叠(异步)执行。在同步执行时,函数直到操作完成后才返回。这意味着在同步执行时线程会被阻塞,从而导致效率下降。在重叠执行时,即使操作还未完成,调用的函数也会立即返回。费时的I/O操作在后台进行,这样线程就可以干别的事情。例如,线程可以在不同的句柄上同时执行I/O操作,甚至可以在同一句柄上同时进行读写操作。“重叠”一词的含义就在于此。

ReadFile函数只要在串口输入缓冲区中读入指定数量的字符,就算完成操作。而WriteFile函数不但要把指定数量的字符拷入到输出缓冲中,而且要等这些字符从串口送出去后才算完成操作。

ReadFile和WriteFile函数是否为执行重叠操作是由CreateFile函数决定的。如果在调用CreateFile创建句柄时指定了FILE_FLAG_OVERLAPPED标志,那么调用ReadFile和WriteFile对该句柄进行的读写操作就是重叠的,如果未指定重叠标志,则读写操作是同步的。

函数ReadFile和WriteFile的参数和返回值很相似。这里仅列出ReadFile函数的声明:

BOOL ReadFile(

HANDLE hFile,//文件句柄

LPVOID lpBuffer,//读缓冲区

DWORD nNumberOfBytesToRead,//要求读入的字节数

LPDWORD lpNumberOfBytesRead,//实际读入的字节数

LPOVERLAPPED lpOverlapped//指向一个OVERLAPPED结构

);//若返回TRUE则表明操作成功

需要注意的是如果该函数因为超时而返回,那么返回值是TRUE。参数lpOverlapped在重叠操作时应该指向一个OVERLAPPED结构,如果该参数为NULL,那么函数将进行同步操作,而不管句柄是否是由FILE_FLAG_OVERLAPPED标志建立的。

当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,线程应该调用GetLastError函数分析返回的结果。例如,在重叠操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。

在使用重叠I/O时,线程需要创建OVERLAPPED结构以供读写函数使用。OVERLAPPED结构最重要的成员是hEvent,hEvent是一个事件对象句柄,线程应该用CreateEvent函数为hEvent成员创建一个手工重置事件,hEvent成员将作为线程的同步对象使用。如果读写函数未完成操作就返回,就那么把hEvent成员设置成无信号的。操作完成后(包括超时),hEvent会变成有信号的。

如果GetLastError函数返回ERROR_IO_PENDING,则说明重叠操作还为完成,线程可以等待操作完成。有两种等待办法:一种办法是用象WaitForSingleObject这样的等待函数来等待OVERLAPPED结构的hEvent成员,可以规定等待的时间,在等待函数返回后,调用GetOverlappedResult。另一种办法是调用GetOverlappedResult函数等待,如果指定该函数的bWait参数为TRUE,那么该函数将等待OVERLAPPED结构的hEvent事件。GetOverlappedResult可以返回一个OVERLAPPED结构来报告包括实际传输字节在内的重叠操作结果。

如果规定了读/写操作的超时,那么当超过规定时间后,hEvent成员会变成有信号的。因此,在超时发生后,WaitForSingleObject和GetOverlappedResult都会结束等待。WaitForSingleObject的dwMilliseconds参数会规定一个等待超时,该函数实际等待的时间是两个超时的最小值。注意GetOverlappedResult不能设置等待的时限,因此如果hEvent成员无信号,则该函数将一直等待下去。

在调用ReadFile和WriteFile之前,线程应该调用ClearCommError函数清除错误标志。该函数负责报告指定的错误和设备的当前状态。

调用PurgeComm函数可以终止正在进行的读写操作,该函数还会清除输入或输出缓冲区中的内容。

(四)超时设置

在用ReadFile和WriteFile读写串口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetCommTimeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。

有两种超时:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延,总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用COMMTIMEOUTS结构可以规定读/写操作的超时,该结构的定义为:

typedef struct_COMMTIMEOUTS {

DWORD ReadIntervalTimeout;//读间隔超时

DWORD ReadTotalTimeoutMultiplier;//读时间系数

DWORD ReadTotalTimeoutConstant;//读时间常量

DWORD WriteTotalTimeoutMultiplier;//写时间系数

DWORD WriteTotalTimeoutConstant;//写时间常量

} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:总超时=时间系数×要求读/写的字符数+时间常量

例如,如果要读入10个字符,那么读操作的总超时的计算公式为:读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant

可以看出,间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。

如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时,如果ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD并且两个读总超时为0,那么在读一次输入缓冲区中的内容后读操作就立即完成,而不管是否读入了要求的字符。

在用重叠方式读写串口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。

四、结束语

以上给出了用Win32 API设计串行通信的基本思路,这个重叠(异步)I/O操作的串行通信程序,曾多次应用于大型任务,表现出良好的性能。在实际应用中,可以以此为模型稍加改造,设计出满足需要的各种串行通信程序。

参考文献:

[1]李现勇.Visual C++串口通信技术与工程实践[M].人民邮电出版社,2004,7

上一篇:小组有效性下一篇:医院支出控制

热搜文章

    相关推荐