在线求救iFix存储的一个问题 点击:1354 | 回复:12



lw1027

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-03 08:48:00
楼主
背景:本人用IFix3.5通过以太网(OPC)采集第三方数据,本工控机将采集到的数据,通过ModBus(RS485)传输到模拟屏上

问题:工程正常工作1小时左右后出现:"系统错误 Allocation of Shareable Memory Failed"。反复实验后,发现每次出现此问题,都是因为iFix运行后,每秒增加60K左右内存使用量,内存使用完时出现此错误

请各位高手赐教,是什么引起的这个错误,怎么解决这个问题,谢谢!



Ents

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 58回
  • 年度积分:0
  • 历史总积分:112
  • 注册:2003年2月16日
发表于:2007-04-03 14:08:00
1楼
如何读取ifix3.5的数据,还是采用VBA方式,如果利用VBA方式,问题主要在于你的编程造成内存泄露。

gelic

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 42回
  • 年度积分:0
  • 历史总积分:121
  • 注册:2005年10月12日
发表于:2007-04-03 21:32:00
2楼
ifix内存泄漏是有的。找找补丁,打上。一般可以解决问题。另外,尽量不要在脚本里面做定时处理的任务。

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-04 08:58:00
3楼
gelic: 
你说“尽量不要在脚本里面做定时处理的任务”,但采集的OPC的数据不用定时,那怎么可以让OPC的数据到MB中去呢?

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-04 09:06:00
4楼
ents: 
我是采用VBA方式,请问在哪里可以找到补丁,可以解决编程造成内存泄露?

Ents

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 58回
  • 年度积分:0
  • 历史总积分:112
  • 注册:2003年2月16日
发表于:2007-04-04 09:51:00
5楼
不是使用补丁,而是在编程时要注意释放掉开辟的内存,以一定的时间间隔输出数据。如开始开辟内存,在数据生产后,关闭开辟的内存。时间一般放大一些,最好是5秒的间隔。

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-04 11:08:00
6楼
ents:
我在编程时使用了三个定时器,你说“在编程时要注意释放掉开辟的内存,以一定的时间间隔输出数据”,时间间隔是指三个定时器之间的间隔,还是对单个定时器的时间间隔?
“如开始开辟内存,在数据生产后,关闭开辟的内存。时间一般放大一些,最好是5秒的间隔。”,是指在VBA中使用专门的命令实现,还是仅仅靠时间的延长实现?
谢谢

Ents

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 58回
  • 年度积分:0
  • 历史总积分:112
  • 注册:2003年2月16日
发表于:2007-04-04 12:35:00
7楼
5秒间隔是单个定时器,你使用一个定时器就可以了,也许你使用三个造成了互相之间资源的占用,尽量减少定时器的使用。

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-04 15:53:00
8楼
我已经将三个定时器改为一个,问题并没有得到根本解决

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-04 16:00:00
9楼
Private Sub T1_OnTimeOut(ByVal lTimerId As Long)
On Error Resume Next
Fix32.Fix.D60104.F_CV = Date - #3/27/2007#
Dim MyTime
MyTime = Now
Fix32.Fix.D60206.F_CV = Minute(MyTime) * 100 + Second(MyTime)
Fix32.Fix.D602062.F_CV = Hour(MyTime)
Dim MyDate
MyDate = Date
Fix32.Fix.D60106.F_CV = Month(MyDate) * 100 + Day(MyDate)
Fix32.Fix.D601062.F_CV = Year(MyDate)
If Fix32.Fix.GUZHANG.F_CV = 0 Then
Dim MyTime2
MyTime2 = Now
Fix32.Fix.D60208.F_CV = Minute(MyTime2) * 100 + Second(MyTime2)
Fix32.Fix.D602082.F_CV = Hour(MyTime2)
Dim MyDate2
MyDate2 = Date
Fix32.Fix.D60108.F_CV = Month(MyDate2) * 100 + Day(MyDate2)
Fix32.Fix.D601082.F_CV = Year(MyDate2)
End If
End Sub


Private Sub T2_OnTimeOut(ByVal lTimerId As Long)
On Error Resume Next
Fix32.FIX.DL01011.F_CV=Fix32.FIX.ODL0101.F_CV
Fix32.FIX.DL0101.F_CV=Fix32.FIX.ODL0101.F_CV Xor 1
Fix32.FIX.DL02011.F_CV=Fix32.FIX.ODL0201.F_CV
Fix32.FIX.DL0201.F_CV=Fix32.FIX.ODL0201.F_CV Xor 1
Fix32.FIX.DL03011.F_CV=Fix32.FIX.ODL0301.F_CV
Fix32.FIX.DL0301.F_CV=Fix32.FIX.ODL0301.F_CV Xor 1
Fix32.FIX.DL04011.F_CV=Fix32.FIX.ODL0401.F_CV
Fix32.FIX.DL0401.F_CV=Fix32.FIX.ODL0401.F_CV Xor 1
Fix32.FIX.DL05011.F_CV=Fix32.FIX.ODL0501.F_CV
Fix32.FIX.DL0501.F_CV=Fix32.FIX.ODL0501.F_CV Xor 1
Fix32.FIX.DL06011.F_CV=Fix32.FIX.ODL0601.F_CV
Fix32.FIX.DL0601.F_CV=Fix32.FIX.ODL0601.F_CV Xor 1
Fix32.FIX.DL07011.F_CV=Fix32.FIX.ODL0701.F_CV
Fix32.FIX.DL0701.F_CV=Fix32.FIX.ODL0701.F_CV Xor 1
......
End Sub


Private Sub T3_OnTimeOut(ByVal lTimerId As Long)
On Error Resume Next
Fix32.FIX.D40101.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40201.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D60101.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D60201.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D60301.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D60401.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D60501.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40102.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40202.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40302.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40103.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40203.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40303.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40403.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40503.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40603.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40703.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40803.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D40903.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D41003.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D41103.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D41203.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D41303.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D41403.F_CV=Fix32.FIX.CESHI.F_CV*100
Fix32.FIX.D41503.F_CV=Fix32.FIX.CESHI.F_CV*100
......
End Sub

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-04 16:02:00
10楼
这样编程,这些变量可不可以释放出内存哦?
=后是OPC输入数
=前是MB1输出数

Ents

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 58回
  • 年度积分:0
  • 历史总积分:112
  • 注册:2003年2月16日
发表于:2007-04-06 14:16:00
11楼
你所写的语法都不正确,肯定要出错的。

lw1027

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:93
  • 注册:2006年4月14日
发表于:2007-04-08 11:00:00
12楼
 ents:
我语法有什么问题,请指正一下,我刚用VBA编程,所以有些不懂,谢谢!

热门招聘
相关主题

官方公众号

智造工程师