[信捷] 【案例】如何使用PLC或者触摸屏,自动计算时钟的时间差?

[复制链接]
查看49352 | 回复0 | 2025-1-7 11:45:12 | 显示全部楼层 |阅读模式
有一种染色助剂调配好后的有效期是72个钟,超过72小时需要提示报警做报废处理。

操作就是人工调配好后,在触摸屏上按下开始,然后PLC或者触摸屏自动计算。考虑到放假时停电关机,所以用计时器累计行不通,只能用实时时钟做减法,这样就算中途停电也不影响。

大概思路时,工人调配好后,按一个键记录下当前的实际时钟,然后隔一段时间调出最新时间与前面的时间相减即可。我想用威纶通触摸屏的宏指令做,上网搜了一下,没看到有专门的函数,只能自己写程序判断这就麻烦了,要判断闰年(2月是28天还是29天)、月大(31天)、月小(30天)

大家有什么好的想法和建议呢?









- WE NEED YOU -



你的问题有点问题

【考虑到放假时停电关机】~如果放假超过72个钟(是小时?)啥方法都难实现,除非有值班的那就用一个用电池的独立定时器。

抛开放假停机可能产生的问题
可以这样~交给PLC来做
触摸屏启动按键开始记录,同时修正PLC时钟(PLC时钟误差太大)
PLC里就简单了~就怕所用PLC没有时钟或没有时钟运算指令就算放假时长超过72小时,那么来上班通电时也会马上报警提醒,工人报废处理不用就可以了。

我这个PLC是信捷XC3的,带有时钟功能,问题是也很麻烦,月大、月小这些也都要考虑。





信捷的没有实际使用过

你可以做个实验,编个小程序,~很简单





先将PLC时钟改为20年2月28日,再给D171赋值72(小时),查看D160,D161,D162

如果对应数据变为20年3月2日,说明所用PLC具有"万年历"功能。
西门子官方论坛有一个是计算天数的
//计算两个年份之间的天数。只计算完整一年这部分。
//基本好像可以。。。。。
if year1+1>=year2 then    //没有完整的一年,不参与计算
else
for i=year1+1 to year2-1
if i%4==0 then
  sum=sum+366    //闰年算366日
else
  sum=sum+365    //平年算365日
end if
next i
end if
//计算两个月份之间的天数
if (year1==year2)&(month1+1>=month2) then   //年相同,月之间没有完整月,就不需要计算什么。
else     //否则就出现后面两种情况……
if year1==year2 then   //这是第一种情况,年相等,直接计算。
if year1%4==0 then   //闰年了
  mon[1]=29
else
  mon[1]=28
end if
for i=month1 to month2-2 //从当前月的下一个月起,累加,到结束之前的一个月。
sum=sum+mon
next i
else       //这是第二种情况,年不相等,分两段计算月。

//1 2 3 4 5 6 7 8 9 10 11 12
//1 2 3 4 5 6 7 8 9 10 11 12
if month1<>12 then   //计算前段不足一年的月数的天数。
  if year1%4==0 then   //闰年了
   mon[1]=29
  else
   mon[1]=28
  end if
  for i=month1 to 11
   sum=sum+mon
  next i
end if
if month2<>1 then   //计算后段不足一年的月数的天数。
  if year2%4==0 then   //闰年了
   mon[1]=29
  else
   mon[1]=28
  end if
  for i=0 to month2-2
   sum=sum+mon
  next i
end if
end if
end if
//计算两个日期之间的天数
if (year1==year2)&(month1==month2) then
sum=day2-day1
else
if year1%4==0 then
mon[1]=29
else
mon[1]=28
end if
i=month1-1
sum=mon-day1+day2+sum
end if
你不需要看代码,只需要看文字解释就可以大概地了解这个计算日子的过程。就要这么多的过程。









停电保持计时器(寄存器)不行?
你说的实时时钟,大概也是要精度要求(比如1分钟),而大部分的实时时钟做减法,在plc和触屏里,没有万年历,是不行的.这个在pc里,是完全没问题的。停电保持只是保持住,但在停电期间不会继续计时。

我只要求到小时

比如1月30日8点开始,那么2月2日早上8点到期.

如果是4月30日8点开始,那么就是5月3日早上8点到期.(因为4月小只有30天)

还有2月有28天的也有29天的,条件有点多,所以判断起来比较麻烦

如果有专用函数就好办,否则也就只能这样了





其实这个思路很简单就可以搞定,停电的时候记录好时间保存,再上电的时候,用当前时间和停电时间作比较,超过72小时,物料报废思路确实简单明了,只是计算起来条件有点多,每个月的天数不一样。



最终解决方法2023/09/16
想到一个折中的办法,由于是72个钟,用星期就可以了,一般中途放假不会超过7天,春节放假期间是要先处理调好料的。

本人英语不行,定义名字就用拼音缩写了。



short SSSJ,SSXQ,N
short JLSJ[12],JLXQ[12],XSYS[12],XQJG[12]
bool BJ[12]

GetData(SSSJ, "Local HMI", LW, 9019, 1)
GetData(SSXQ, "Local HMI", LW, 9023, 1)
GetData(JLSJ[0], "Local HMI", RW, 10, 12)
GetData(JLXQ[0], "Local HMI", RW, 50, 12)

for N=0 to 11

XQJG[N]=SSXQ-JLXQ[N]

if XQJG[N]<0 then
XQJG[N]=XQJG[N]+7
else
XQJG[N]=XQJG[N]
end if

XSYS[N]=XQJG[N]*24+(SSSJ-JLSJ[N])

if XSYS[N]>=72 then
BJ[N]=1
else
BJ[N]=0
end if
next

SetData(XSYS[0], "Local HMI", RW, 80, 12)
SetData(XQJG[0], "Local HMI", RW, 100, 12)
SetData(BJ[0], "XINJE XC Series", M, 0, 12)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则