技术论坛

时间倒计时-SCL源程序--自谋出路,已成功

作者 主题
游民

经验值: 122
发帖数: 22
精华帖: 0
主题:时间倒计时-SCL源程序--自谋出路,已成功


只看楼主 楼主 2013-12-04 20:29:12
http://www.ad.siemens.com.cn/club/bbs/post.aspx?b_id=4&a_id=1018784
大家好,上述是一个用SCL编写的时间倒计时功能,由于作者没有提供SCL的源程序呵呵,本人也想学习SCL。就想着看编译好的STL反推SCL,想半天没弄明白数据类型的转换……
其中,输入的管脚有 年、月、日,以BYTE类型输入,现在问题是:
如何将年、月、日(3个BYTE)在SCL中综合成一个DATA_AND_TIME?

自己写了一个SCL,但是有错误一个,自己查不出来。。。水平有限,请高手改正一下,谢谢。在2楼

2013-12-10 源程序已模拟测试过,能过实现时间天数的倒计时,程序 在7楼
 
以下网友喜欢您的帖子:

  
重要声明:

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

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

侠圣

经验值: 2123
发帖数: 551
精华帖: 6
回复:时间倒计时-SCL-源程序


只看楼主 1楼 2013-12-04 22:45:25
这不我搞的那程序吗,你搞明白DATE_AND_TIME数据类型了不就搞明白怎么转换的了吗
欢迎关注西门子民间技术支持微信公众帐号。
以下网友喜欢您的帖子:

  
游民

经验值: 122
发帖数: 22
精华帖: 0
回复:时间倒计时-SCL-源程序


只看楼主 楼主 2楼 2013-12-05 12:16:11
我自己写了一个,但发现有错误,求大侠指点改正
FUNCTION_BLOCK FB200
VAR_INPUT
enable:BOOL;
current_time:DATE_AND_TIME;
sp_year:INT;
sp_month:INT;
sp_day:INT;
days_to_remind:INT;
END_VAR
VAR
sp_time:DATE_AND_TIME;
sp_year_state:INT;
sp_month_state:INT;
sp_day_state:INT;
sp_time_cal:WORD;
current_time_cal:WORD;
sp_time_AT AT sp_time:ARRAY[0..7] OF BYTE; //编译后错误,指向这里
END_VAR
VAR_OUTPUT
days_left:INT;
days_over:INT;
start_remind:BOOL;
have_over:BOOL;
END_VAR
BEGIN
sp_year_state:=sp_year;
sp_month_state:=sp_month;
sp_day_state:=sp_day;
sp_time_AT[0]:=(sp_year_state);
sp_time_AT[1]:=(sp_month_state);
sp_time_AT[2]:=(sp_day_state);
current_time_cal:=DT_DATE(IN :=current_time
); // IN: DATE_AND_TIME
// DATE
sp_time_cal:=DT_DATE(IN :=sp_time // IN: DATE_AND_TIME
); // DATE
days_left:=WORD_TO_INT(sp_time_cal)-WORD_TO_INT(current_time_cal);
IF days_left<0 THEN
days_over:=days_left*(-1);
have_over:=true;
END_IF;
IF days_left<=days_to_remind THEN
start_remind:=true;
END_IF;
END_FUNCTION_BLOCK
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2123
发帖数: 551
精华帖: 6
回复:时间倒计时-SCL-源程序


只看楼主 3楼 2013-12-05 12:51:01
你搞的这太乱了,数据类型好多错的。
举个简单例子:
sp_time_cal:=DT_DATE(IN :=sp_time // IN: DATE_AND_TIME
); // DATE
DT_DATE指令输出怎么可能是word呢??还有AT指令应该放到sp_time下边吧?
欢迎关注西门子民间技术支持微信公众帐号。
以下网友喜欢您的帖子:

  
游民

经验值: 122
发帖数: 22
精华帖: 0
回复:时间倒计时-SCL-源程序


只看楼主 楼主 4楼 2013-12-05 13:01:49
我自己在LAD中实现了,因为是新手,想学习SCL,就尽量去“模仿”,见谅……
 
以下网友喜欢您的帖子:

  
游民

经验值: 122
发帖数: 22
精华帖: 0
回复:时间倒计时-SCL-源程序


只看楼主 楼主 5楼 2013-12-05 15:57:48
这次修改后,编译没错误,但是。。。。功能没实现
FUNCTION_BLOCK FB200
VAR_INPUT
enable:BOOL;
current_time:DATE_AND_TIME;
sp_year:INT;
sp_month:INT;
sp_day:INT;
days_to_remind:INT;
END_VAR
VAR
sp_time:DATE_AND_TIME;
sp_year_state:INT;
sp_month_state:INT;
sp_day_state:INT;
sp_time_cal:DATE;
current_time_cal:DATE;
sp_time_AT AT sp_time:ARRAY[0..7] OF BYTE;
END_VAR
VAR_OUTPUT
days_left:INT;
days_over:INT;
start_remind:BOOL;
have_over:BOOL;
END_VAR
BEGIN
sp_year_state:=sp_year;
sp_month_state:=sp_month;
sp_day_state:=sp_day;
sp_time_AT[0]:=DINT_TO_BYTE(INT_TO_DINT(sp_year_state));
sp_time_AT[1]:=DINT_TO_BYTE(INT_TO_DINT(sp_month_state));
sp_time_AT[2]:=DINT_TO_BYTE(INT_TO_DINT(sp_day_state));
current_time_cal:=DT_DATE(IN :=current_time
); // IN: DATE_AND_TIME
// DATE
sp_time_cal:=DT_DATE(IN :=sp_time // IN: DATE_AND_TIME
); // DATE
days_left:=DINT_TO_INT(DATE_TO_DINT(sp_time_cal))-DINT_TO_INT(DATE_TO_DINT(current_time_cal));
IF days_left<0 THEN
days_over:=days_left*(-1);
have_over:=true;
END_IF;
IF days_left<=days_to_remind THEN
start_remind:=true;
END_IF;
END_FUNCTION_BLOCK
 
以下网友喜欢您的帖子:

  
游民

经验值: 122
发帖数: 22
精华帖: 0
回复:时间倒计时-SCL-源程序--自谋出路,已成功


只看楼主 楼主 7楼 2013-12-10 15:33:38
FUNCTION_BLOCK FB200
VAR_INPUT
enable:BOOL;
current_time:DATE_AND_TIME;
sp_year:INT;
sp_month:INT;
sp_day:INT;
days_to_remind:INT;
END_VAR
VAR
sp_time:DATE_AND_TIME;
sp_year_state:INT;
sp_month_state:INT;
sp_day_state:INT;
sp_time_cal:DATE;
current_time_cal:DATE;
sp_time_AT AT sp_time:ARRAY[0..7] OF BYTE;
END_VAR
VAR_OUTPUT
days_left:INT;
days_over:INT;
start_remind:BOOL;
have_over:BOOL;
END_VAR
BEGIN
sp_year_state:=sp_year;
sp_month_state:=sp_month;
sp_day_state:=sp_day;
sp_time_AT[0]:=WORD_TO_BYTE(INT_TO_BCD(sp_year_state));//关键在此,BCD和WORD一样,没有
sp_time_AT[1]:=WORD_TO_BYTE(INT_TO_BCD(sp_month_state));//BCD转BYTE,但有WORD转BYTE
sp_time_AT[2]:=WORD_TO_BYTE(INT_TO_BCD(sp_day_state));
current_time_cal:=DT_DATE(IN :=current_time
); // IN: DATE_AND_TIME
// DATE
sp_time_cal:=DT_DATE(IN :=sp_time // IN: DATE_AND_TIME
); // DATE
days_left:=DINT_TO_INT(DATE_TO_DINT(sp_time_cal))-DINT_TO_INT(DATE_TO_DINT(current_time_cal));
IF days_left>=0 THEN have_over:=False; days_over:=0;
END_IF;
IF days_left<0 THEN
days_over:=days_left*(-1);
have_over:=true;
END_IF;
IF days_left<=days_to_remind THEN
start_remind:=true;
ELSE
start_remind:=false;
END_IF;
END_FUNCTION_BLOCK

源程序已模拟过,可以实现功能。
希望以后大侠们放出功能块时,最好能将源程序附上,供学习,搞 神秘,保密 对于我们这些新手多难
 
以下网友喜欢您的帖子:

  
侠圣

经验值: 2410
发帖数: 427
精华帖: 0
回复:时间倒计时-SCL源程序--自谋出路,已成功


只看楼主 8楼 2013-12-11 08:40:20
有个截图就更好了
 
以下网友喜欢您的帖子:

  
游民

经验值: 122
发帖数: 22
精华帖: 0
回复:时间倒计时-SCL源程序--自谋出路,已成功


只看楼主 楼主 10楼 2013-12-11 08:49:23
不知道如何上传图。。。
 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
时间倒计时-SCL源程序--自谋出路,已成功
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。