首页 上一页 1 2 下一页 尾页

求助:ifix标签拆点 点击:5187 | 回复:33



guanfeng

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 18回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2003年10月28日
发表于:2007-10-15 12:17:00
楼主
ifix同concept通讯,为了节省I/O点,需要拆点取值,看了其它论坛定义AR块用F_0~F_15,可是不行,
不知有没有那位高手做过相关工程给小弟详细指点,不胜感激!



昆仑摩勒

  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2007-10-15 12:27:00
1楼
用脚本拆就是啦

guanfeng

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 18回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2003年10月28日
发表于:2007-10-15 12:56:00
2楼
能说的详细点吗?第一次用IFIX,谢谢!

昆仑摩勒

  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2007-10-15 14:05:00
3楼
第一种方法: 
1、定义标签QQ,类型选用AR(模拟量寄存器类型) 
2、在画面中随意做一个开关量对象,比如Data Link 
3、给对象赋数据源时选择该标签,但格式为 
     FIX32.nodename.QQ.F_0 
     F_0表示模拟量QQ的第一位,相对应F_15指第16位 
4、切换到运行状态即可显示变化的位了 

注意: 
1、该方法必须使用AR类型。 
2、无法形成历史数据和报警数据。 
3、速度极快!省IO点。但不要滥用,会减少很多功能! 
4、取位的话,定义成DR类型。 
  
  
第二种方法: 比如153转换成二进制是10011001 如果你bitvalue(153,1) 153的第一位就是1 第二位就是0,除了0就是1
Public Function BitValue(MyNumber As Long, BitNumber As Long) As Integer 
    Dim intValue1 As Long 
    Dim intValue2 As Long 
    Dim intValue3 As Integer 
    Dim intValue4 As Long 
    Dim intValue5 As Long 
     
    If (MyNumber > 65535 Or MyNumber < 0) Then 
        MsgBox "FUNCTION BITVALUE ERROR, OUT OF RANGE1.", vbCritical + vbOKOnly, "ERROR" 
        Exit Function 
    End If 
    If (BitNumber > 16 Or BitNumber <= 0) Then 
        MsgBox "FUNCTION BITVALUE ERROR, OUT OF RANGE2.", vbCritical + vbOKOnly, "ERROR" 
        Exit Function 
    End If 
    If BitNumber = 1 Then 
        intValue1 = MyNumber Mod 2 
        If intValue1 > 0.5 Then 
            intValue3 = 1 
        Else 
            intValue3 = 0 
        End If 
    Else 
        intValue1 = 2 ^ BitNumber 
        intValue2 = MyNumber Mod intValue1 
        intValue4 = 2 ^ (BitNumber - 1) 
        intValue5 = MyNumber Mod intValue4 
        intValue1 = intValue2 - intValue5 
        If intValue1 > 0.5 Then 
            intValue3 = 1 
        Else 
            intValue3 = 0 
        End If 
    End If 
    BitValue = intValue3 
End Function 
  
或 
  
Public Function bit(DecimalValue As Long, bitN As Integer) As Boolean 
Dim result As String 
Dim ExtraDigitsNeeded As Integer 
DecimalValue = Abs(DecimalValue) 
Do 
    result = CStr(DecimalValue Mod 2) & result 
    DecimalValue = DecimalValue \ 2 
Loop While DecimalValue > 0 
'保留16位长度 
ExtraDigitsNeeded = 16 - Len(result) 
If ExtraDigitsNeeded > 0 Then 
    result = String(ExtraDigitsNeeded, "0") & result 
End If 
'取第几bit 
result = Mid(result, Abs(bitN - 16), 1) 
'返回数据 
bit = result 
End Function 

guanfeng

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 18回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2003年10月28日
发表于:2007-10-15 15:43:00
4楼
谢谢昆仑摩勒
我通过脚本已经实现了,不过我要是从IFIX写到CONCEPT应怎做?
有相关的代码吗?

昆仑摩勒

  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2007-10-16 12:47:00
5楼
不好意思 CONCEPT 我不知道是什么东东 呵呵 不过ifix提供实时数据的ODBC接口 和OPC server  你可以用到吧

guanfeng

  • 精华:1帖
  • 求助:0帖
  • 帖子:10帖 | 18回
  • 年度积分:0
  • 历史总积分:79
  • 注册:2003年10月28日
发表于:2007-10-17 09:06:00
6楼
concept是昆腾PLC的编程软件。我的意思是如何设置IFIX模拟量标签0~15位。然后把模拟量写入PLC。

昆仑摩勒

  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2007-10-17 16:55:00
7楼
你要整个写进去还是一位一位的写?照你的想法(节省标签点),你只有整个写进去了 很简单啊 建立个AO就可以了,如果这个你还不会的话,只有自己看帮助喽

王晟磊

  • 精华:12帖
  • 求助:0帖
  • 帖子:70帖 | 687回
  • 年度积分:0
  • 历史总积分:1173
  • 注册:2004年2月11日
发表于:2007-10-17 18:21:00
8楼
按整个保持型寄存器写入,下面的PLC内再用MOVE功能块从字到位转换.

deng_lp

  • 精华:5帖
  • 求助:0帖
  • 帖子:65帖 | 2669回
  • 年度积分:0
  • 历史总积分:2876
  • 注册:2001年6月19日
发表于:2007-10-26 09:20:00
9楼
不错,写得好

金军辉

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 30回
  • 年度积分:0
  • 历史总积分:113
  • 注册:2006年5月12日
发表于:2007-10-26 09:28:00
10楼
说的详细,学习了

窝头.红烧肉

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2007年8月16日
发表于:2007-11-11 23:01:00
11楼
昆仑摩勒,你这个家伙,倒是挺热心,但是不太负责任,只会照搬网上的东西。
guanfeng,不必使用脚本,ifix可以拆位。
AR点拆位的说法在网上满天飞,但其实根本就是错的,看过帮助的人都应该知道,不是AR而应该是DR,我是做过实验的,千真万确。至于向回写,我没有试过,但我感觉直接写这个DR点就应该可以。你自己试一下吧。

yyy1234

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 21回
  • 年度积分:0
  • 历史总积分:171
  • 注册:2002年10月29日
发表于:2007-11-13 16:02:00
12楼
   AR是模拟量寄存器,DR是数字量寄存器,可以分辨扩展模拟/数字量的点数,使用方法都是一样的,也可以回写

昆仑摩勒

  • 精华:1帖
  • 求助:1帖
  • 帖子:32帖 | 446回
  • 年度积分:0
  • 历史总积分:1058
  • 注册:2004年11月22日
发表于:2007-11-14 09:05:00
13楼
哈哈 不好意思 我确实是直接拷网上的,也试过AR不行,可是很多东西自己不实践就不知道是错的 哈哈

tcs

  • 精华:0帖
  • 求助:0帖
  • 帖子:68帖 | 526回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2004年8月25日
发表于:2007-11-14 11:42:00
14楼
昆仑摩勒说得对,你只能够在动态画面节省IO点,不能建立报警点或者历史采集点。 不能节省IO点就不能节省成本。最理想的是把16个DI/DO变成1个Register,这样做,就可以把大量的DI/DO点节省,举例说,你有3200点DI/DO,500点AI/AO,起码你要买3700点的授权,如果能够用我刚才说的办法,你只需要买700点的授权。 如果你真的要节省成本,你有机会可以看看美国Iconics公司的“创世纪32”GENESIS32,就支持这个功能,有一点很好的是你不需要写那些脚本,写脚本根本是一个麻烦的事情,写完还有测试,不一定成功,“创世纪32”里面有一个功能叫BitTest(x,y),x是你的变量,y是你要读的Bit的位置,十分方便,是标准的功能,没有问题,不需要测试,还有你可以把DI/DO点“写”到Concept里面,我再说一片:你可以把DI/DO点“写”到Concept里面,这个功能同样可以定义在报警点和历史采集点。是满足我刚才提出的全面节省点的要求。
从这个图你可以看见BitTest这个功能是怎么样在动态图连接的设定。没有脚本!!
从这个图你可以看见BitTest这个功能在报警组态是怎么样设定。建立了16个报警变量,但是只用了1个IO点!!同样地,在历史采集设定也是一样做法!!

茗风

  • 精华:4帖
  • 求助:1帖
  • 帖子:77帖 | 1272回
  • 年度积分:0
  • 历史总积分:5069
  • 注册:2006年11月16日
发表于:2007-11-15 10:15:00
15楼
支持这样的讨论。

~浮游生物~

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 17回
  • 年度积分:30
  • 历史总积分:79
  • 注册:2006年5月23日
发表于:2007-11-16 16:42:00
16楼
没想到这个问题还是有这么多讨论,拆位的方法用AR是肯定不行的。要想省上位开关量点,用DR是最省的。一个DR最多可以包含2000个开关量(不是拆位),我们公司在工程上基本上都是用这种方法做的,绝对可行。

tcs

  • 精华:0帖
  • 求助:0帖
  • 帖子:68帖 | 526回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2004年8月25日
发表于:2007-11-16 19:02:00
17楼
To: ~浮游生物~
请问在报警Tag和历史趋势Tag中能否使用这办法省点?

tcs

  • 精华:0帖
  • 求助:0帖
  • 帖子:68帖 | 526回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2004年8月25日
发表于:2007-11-17 01:57:00
18楼
To: ~浮游生物~
你能否回答!

tcs

  • 精华:0帖
  • 求助:0帖
  • 帖子:68帖 | 526回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2004年8月25日
发表于:2007-11-17 19:17:00
19楼
To: ~浮游生物~

~浮游生物~

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 17回
  • 年度积分:30
  • 历史总积分:79
  • 注册:2006年5月23日
发表于:2007-11-21 08:58:00
20楼
DR点不支持报警,所有需要报警的点需单独定义成DI,但dr支持历史报警(ODBC),只不过没有注释。历史趋势我没有试过

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 下一页 尾页