技术论坛

SCL中如何实现time格式的值进行加减

作者 主题
侠圣

经验值: 4769
发帖数: 360
精华帖: 0
主题:【求助】SCL中如何实现time格式的值进行加减


只看楼主 楼主 2022-07-15 19:08:45

我想做个延时定时器,里面用time值进行加,发现编译不了。

TIME_DB.SD.value  格式为time

OB1_PREV_CYCLE  格式为time 为PLC的扫描周期

如何实现

TIME_DB.SD.value:=TIME_DB.SD.value +OB1_PREV_CYCLE;


FC_TimeSDSF.txt



 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1770875&b_id=4&num=0

版主

经验值: 12752
发帖数: 5866
精华帖: 44
回复:SCL中如何实现time格式的值进行加减


只看楼主 1楼 2022-07-18 11:22:25

将数据类型更换一下试试


数字飞舞
以下网友喜欢您的帖子:

  
侠圣

经验值: 4092
发帖数: 565
精华帖: 4
回复:SCL中如何实现time格式的值进行加减


只看楼主 2楼 2022-07-18 11:49:15

扩展指令中的 时间日期   中有相应的指令。

T_ADD


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2790
发帖数: 390
精华帖: 5
回复:SCL中如何实现time格式的值进行加减


只看楼主 3楼 2022-07-18 14:36:24

给你一个启发,定时器可以这样做

通电延时( ODT)

FUNCTION FC1 : VOID

TITLE = 'Block Title'

//

// Block Comment...

//

VERSION: '1.0'

AUTHOR: BAIKAI

NAME: T_ODT

FAMILY: baikai

know_how_protect

VAR_INPUT

//ODT   

Input_Condition:BOOL:=false;

FP_1Sec:BOOL;

reset:BOOL;

Timer_Setpoint:INT:=0;

END_VAR

VAR_IN_OUT    

   Impls_1Sec_Aux:BOOL;

END_VAR

VAR_OUTPUT

Impls_1Sec:BOOL;    

Output_Delay:BOOL:=false;

Timer_Actual:INT:=0;

END_VAR



//通电延时,不带保持

Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux); 

Impls_1Sec_Aux:= FP_1Sec;

IF NOT reset THEN

    IF (NOT Input_Condition) THEN 

    Timer_Actual:= 0; 

    Output_Delay:= 0; 

    ELSE 

    IF (Impls_1Sec  AND NOT Output_Delay)  THEN 

        Timer_Actual:= Timer_Actual +1; 

    END_IF;

     Output_Delay:= Timer_Actual >= Timer_Setpoint;

END_IF;

ELSE

    Impls_1Sec:=false;

    Timer_Actual:= 0; 

    Output_Delay:= false;

END_IF;          

END_FUNCTION


//通电延时,保持

Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux); 

Impls_1Sec_Aux:= FP_1Sec;

IF NOT reset THEN

    IF Input_Condition THEN

         Output_Aux:=1; 

    END_IF; 

    IF (NOT Output_Aux) THEN 

            Timer_Actual:=0; 

            Output_Delay:=false;

        ELSE

             IF (Impls_1Sec AND NOT Output_Delay) THEN

                 Timer_Actual:= Timer_Actual +1; 

             END_IF;  

                Output_Delay:= Timer_Actual >= Timer_Setpoint;

      END_IF; 

    ELSE

    Impls_1Sec:=false;

    Output_Aux:=false;

    Timer_Actual:= 0; 

    Output_Delay:= false;

//以上为简单思路制作,定时器。 我一般用于数组较多,就是一次做几十个同类的定时器。



大家同行,you ok ? me !
以下网友喜欢您的帖子:

  
侠圣

经验值: 4769
发帖数: 360
精华帖: 0
回复:SCL中如何实现time格式的值进行加减


只看楼主 楼主 4楼 2022-07-18 14:50:16
以下是引用askab在2022-07-18 14:36:24的发言 >

给你一个启发,定时器可以这样做

通电延时( ODT)

FUNCTION FC1 : VOID

TITLE = 'Block Title'

//

// Block Comment...

//

VERSION: '1.0'

AUTHOR: BAIKAI

NAME: T_ODT

FAMILY: baikai

know_how_protect

VAR_INPUT

//ODT   

Input_Condition:BOOL:=false;

FP_1Sec:BOOL;

reset:BOOL;

Timer_Setpoint:INT:=0;

END_VAR

VAR_IN_OUT    

   Impls_1Sec_Aux:BOOL;

END_VAR

VAR_OUTPUT

Impls_1Sec:BOOL;    

Output_Delay:BOOL:=false;

Timer_Actual:INT:=0;

END_VAR



//通电延时,不带保持

Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux); 

Impls_1Sec_Aux:= FP_1Sec;

IF NOT reset THEN

    IF (NOT Input_Condition) THEN 

    Timer_Actual:= 0; 

    Output_Delay:= 0; 

    ELSE 

    IF (Impls_1Sec  AND NOT Output_Delay)  THEN 

        Timer_Actual:= Timer_Actual +1; 

    END_IF;

     Output_Delay:= Timer_Actual >= Timer_Setpoint;

END_IF;

ELSE

    Impls_1Sec:=false;

    Timer_Actual:= 0; 

    Output_Delay:= false;

END_IF;          

END_FUNCTION


//通电延时,保持

Impls_1Sec:= FP_1Sec AND (NOT Impls_1Sec_Aux); 

Impls_1Sec_Aux:= FP_1Sec;

IF NOT reset THEN

    IF Input_Condition THEN

         Output_Aux:=1; 

    END_IF; 

    IF (NOT Output_Aux) THEN 

            Timer_Actual:=0; 

            Output_Delay:=false;

        ELSE

             IF (Impls_1Sec AND NOT Output_Delay) THEN

                 Timer_Actual:= Timer_Actual +1; 

             END_IF;  

                Output_Delay:= Timer_Actual >= Timer_Setpoint;

      END_IF; 

    ELSE

    Impls_1Sec:=false;

    Output_Aux:=false;

    Timer_Actual:= 0; 

    Output_Delay:= false;

//以上为简单思路制作,定时器。 我一般用于数组较多,就是一次做几十个同类的定时器。


这个是我后来写的

FC_Time.txt



 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2790
发帖数: 390
精华帖: 5
回复:SCL中如何实现time格式的值进行加减


只看楼主 5楼 2022-07-18 16:10:32

测试,然后查看测试结果,如果满足工艺,则可以,否则,调整,程序的目的,是方便阅读和修改,替换。

还有你的程序没有复位功能,完全通过IN  使能和去使能,这个有点不方便。我只要是按照S7定时器的逻辑功能制作的。

其次,你的时基用的是MS 这个比我的好,精度高,范围宽,但我主要考虑,一般ms 级别的,还不如做在中断里,因为大部分都是用秒为最基本单位的,所有用了CPU clock memory 。

方式方法很多,只要用的合适就行。



大家同行,you ok ? me !
以下网友喜欢您的帖子:

  
奇侠

经验值: 6006
发帖数: 959
精华帖: 6
回复:SCL中如何实现time格式的值进行加减


只看楼主 6楼 2022-07-19 11:31:08

  SCL编程语言,比较难搞啊,


 
以下网友喜欢您的帖子:

  
至圣

经验值: 19839
发帖数: 4383
精华帖: 2
回复:SCL中如何实现time格式的值进行加减


只看楼主 7楼 2022-07-19 13:05:57

SCL编程要有C语言基础


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2790
发帖数: 390
精华帖: 5
回复:SCL中如何实现time格式的值进行加减


只看楼主 8楼 2022-07-30 14:46:59

SCL编程要有C语言基础

////////////////////////////

文本结构程序,主要考虑的是程序的逻辑性,从开始到结束,西门子的SCL 跟其他PLC的 STL 类似,起始跟过跟PASCAL更接近些。

当然西门子有针对D7 SYS 也有D7-SYS Block Generator ,这个是用C 语言自己编译,生成CFC 块。

但编制程序,最重要 是可读性,稳定性,以及移植性。

如果用LAD可以更好,更快,更稳定的体系逻辑要求,那何必用SCL 呢。每种语言有它存在的必然性,

举个例子,单按钮启动停止

LAD





以上图,均为单按钮启动/ 停止,

             如果单独一个启停逻辑 ,我用STL ,
             如果要增加更多的启动和停止条件 ,我用LAD ,

             如果有很多一样的逻辑处理,例如20个电机一样的启停模式,我用SCL

但移植性最强的是SCL ,毕竟文本结构,形参可以随意定义,中文都可以 ,其次结构比较很合理。

当然阅读通过性,还是LAD 最简单。


大家同行,you ok ? me !
以下网友喜欢您的帖子:

  
侠圣

经验值: 2790
发帖数: 390
精华帖: 5
回复:SCL中如何实现time格式的值进行加减


只看楼主 9楼 2022-07-30 14:48:42

A I0.0

FP M2.0

X Q0.0

= Q0.0


大家同行,you ok ? me !
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
SCL中如何实现time格式的值进行加减
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。