之前发过一个PTP编程方法的系列帖。PTP就是指点到点自由通讯。帖子连接如下:
https://www.ad.siemens.com.cn/club/bbs/PostStory_1963674_80.html#anch
这2天探索了PTP模块的2吃。所谓2吃,就是一个PTP模块同时利用它的232和485口。这就要求对PTP模块实时地频繁地进行232模式和485模式的切换。今天这帖跟大伙说说这事。
先说工艺上。工艺上有2个分子泵(分子泵一种抽真空的高速泵,内含变频器)。这2个泵是一个厂家的,但是型号不同,一个是Mag型,这是一种大泵,工艺中也称为TB1。一种是Turbovac型,是一种小泵,工艺称为TB2。
工艺的要求是:PLC与2个泵进行通信,通过通讯对2个泵进行监控。大泵通讯口是232,小泵通讯口是485,他们均采用USS协议。这个USS协议是我用程序编写的,没有采用博途库里面的块。这个问题先不表。
根据工艺要求,我采用了ET200SP的PTP模块作为与泵通讯的模块。这个模块安装在2个泵旁边的子站中。
这个模块的样子如下
, 图1
图片看着大,实物不大。
由于一个泵是232,另一个泵是485,所以选用2个PTP模块,一个模块用作232通讯,另一个模块用作485通讯。图纸如下

图,2
我编写了程序,2个泵用了同一个FB块,不同的背景数据块实现2个泵的PTP通讯。以上的做法很常规。在我之前的系列帖子中也有讲到这个例子。
在回顾上面图2的PTP模块时,我发现这个模块有个特点。端子1-10用于RS232,端子11-16用于RS485。为此,我联想了一下,能不能充分利用1个模块的端子同时与232泵和485泵通讯呢?1个PTP模块进行2吃。下文称为 “2in1” 。尝试一把。
先改图

图,3
图3中把2个泵的通讯线接到了一个PTP模块中。
然后把之前的通讯程序稍作修改。了解我之前帖子的同行都知道,我编写程序习惯有层次。在这个案例中有层次的程序的优势显现了出来。只需要将之前的程序中应用层改写一下,保证2个通讯不同时进行就可以了。
经过调试,发现我的2吃想法可以实现。到目前已经稳定运行了2天了。也测试了2种异常情况。第一种异常情况:热拔出模块,热插入模块;第二种异常情况:关闭一个泵电源。这2种异常情况下,程序可以很好的适应。
由于程序分层次,也比较大。无法在这里复制。如果有需要的同行,可以联系我。在这里我把程序的结构说一说。

,图 4
Leybold_PB这个文件夹,先不用理会,这个是之前用PROFIBUS通讯的程序。
Leybold_USS这个文件夹中的内容是一个PTP模块对应一个泵进行通讯的程序。这个文件夹是之前编写的。
Leybold_USS_2in1这个文件夹是这次编写的,用于一个PTP模块对应2个泵通讯的程序。其中的一个FB是主要FB,PTP2in1_Leybold。这个FB中程序相对简单。这个块中主要调用了 Leybold_USS这个文件夹中的内容。这也是我之前强调的编程要分层次。虽然有层次的程序架构编程稍微繁琐,但是好处很多。在实现2in1的功能时,80%的程序是之前1to1模式时编写的。当需要2in1模式时,直接拿来用就可以了。
这里说说FB(PTP2in1_Leybold)的内容
,图5
NEWWORK 1 用于触发通讯。要完成,定时功能,完成2个泵通讯不打架的功能。
NEWWORK 4 用于配置PTP模块,收发,复位功能。每次触发本块,要对PTP模块进行配置,配置时,就包括了232/485的选择,波特率等的配置。这里强调,用软件进行配置可以与在硬件中配置相同的效果。但是软件中配置可以随时更改硬件配置。正是由于这一点,所以才可以对一个PTP模块实现频繁地实时地切换232/485工作模式。
NEWWORK 6 用于AA。AA的作用在我之前的系列帖中有描述,这里不多介绍。
NEWWORK 7 用于判定这次通讯结束,并为切换到另外一个泵通讯做准备工作。
下面2张截图就是在OB1中调用PTP2in1_Leybold的情况

图6,大泵的调用

图7,小泵的调用
这里面再介绍一个小技巧。要用一个泵通讯任务结束标志去开启另外一个泵的通讯任务。这种方式来对一个PTP模块进行时间2in1的工作分配。不要用定时器强行分配2个泵的通讯。
这个帖也不短了,先说的到这里吧,以后有想到的,再跟帖。
谢谢.
应7楼伙计的要求,这里把FB(PTP2in1_Leybold)的内容进一步说明。

图1
图1是NETWORK 1的截图。这个段中trigger中,要满足2个条件,那么本实例OPEN。OPEN的意思就是占据了PTP模块端口的使用权。这2个条件是:1,与上一次OPEN的时间间隔要够。2,另外一个实例的通讯任务完成,出让了端口的使用权。
//first scan中的内容是在满足条件的第一个扫描周期进行一些初始化工作。

图2
图2的内容是2个。一个是获取本FB块2次运行的间隔,变量ime.Interval。这个变量在本FB中多次用到。
另外一个内容是判断是否与上一次OPEN的时间间距足够,#Reach_Interval。
NETWORK3 没有太大意义,主要统计本次FB的OPEN持续时间。方便调试工作。

图3
图3是之前在1to1时编程的块。作用是:
1,配置PTP模块。
2,进行收发工作
3,复位接收缓冲区。
这个块是一个通用的用于PTP模块的块。这个块的引脚Init为ture时,这个块就会对端口为Port的PTP模块进行配置。

图4
图4中NETWORK 5的内容是等待图3的块配置完成。当完成是会置位#RS_AA.RO_AA.EnCom。当这个变量有上升沿时,将轮询号码置位为10
NETWORK 6 说明
这个块是一个标准的轮询块。这个块内部含有AA。所以块名称是polling+AA。这个块能完成,当轮询号等于本身的轮询号时,开启AA。
这里特别说明。其实无需轮询,因为就一个AA。但是这个块也是我之前编辑的标准块,被很多项目使用,应该是BUG-FREE,所以就直接拿来用。用着放心。

上图network的作用是判断何时关闭OPEN,并为下次开启OPEN做准备,也为开启另一个FB(PTP2in1_Leybold)实例做准备。
这里多次讲到FB(PTP2in1_Leybold)实例。意思是:
在OB1中有2次调用FB(PTP2in1_Leybold)。每一次都是一个实例。每一个实例对应控制PTP端口的不同物理层。