EtherNet/IP工业以太网白皮书(四) 点击:1447 | 回复:8



伊优

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 34回
  • 年度积分:0
  • 历史总积分:68
  • 注册:2002年3月20日
发表于:2007-08-01 12:20:00
楼主
VI.    一致性测试
设备的互操作性非常重要,它一直是ODVA和ControlNet International在制定EtherNet/IP协议规范时主要考虑的问题之一。这两个组织在全球范围内设立了三家独立的一致性测试实验室,分别在欧洲、北美和日本。与此同时,ODVA和ControlNet International还成立了联合特别兴趣小组(JSIG),负责确保各个实验室测试步骤的一致性。
    通过这些独立的实验室,既能够保证相互竞争的厂商不会因为产品测试而泄露知识产权,又可以确保相关产品能够与其它设备实现无缝集成。
    这样做的目的在于,用户可以从不同的厂商购买所需的部件,而不会只依赖于某个供应商。
第一家实验室于2001年8月10日在美国密歇根州大学成立。紧跟着,在英国沃里克大学和日本京都的先进软件技术及应用研究所(ASTEM RI)成立了两家类似的实验室。
VII.    EtherNet/IP网络的优势
如图8所示,由于ControlNet、DeviceNet和EtherNet/IP都使用相同的应用层协议,所以它们之间能够共享对象库和设备描述信息。这些数据对象和描述信息可以让不同厂商的复杂设备实现即插即用和互操作。数据对象的定义非常严格,在同一网络中,可以完成实时I/O信息、配置信息以及诊断信息的传送。这就意味着无需编制特殊的软件,便可以将各种复杂的设备,例如变频器、机器人控制器、条形码扫描器、称重仪等设备连接在一起。这样一来,不仅能够快速构建控制系统,还方便了对设备的诊断和维护。

图8 EtherNet/IP网络的优势
另外,EtherNet/IP网络能够同时为用户提供显式(信息)报文和隐式(控制)报文传输服务。这样一来,EtherNet/IP网络就能够利用轮询、周期循环、状态改变等触发机制,进行点对点和多点数据传输,从而满足控制层、设备层网络的各种要求。
除此之外,由于ControlNet和DeviceNet的应用已经普及,全球范围内有四百多家厂商为这三种网络提供多达五百余种的设备,而且这些设备之间还能实现互操作。可见,支持EtherNet/IP网络的设备覆盖面相当广泛,其数目和种类也在不断增长。
VIII.    结论
由于采用了三项先进的技术:100Mbps快速以太网、交换式以太网和终端设备全双工通讯方式,不仅减少了以太网数据冲突的可能性,还使得基于以太网的I/O控制成为可能。
以太网和TCP/IP协议已经十分普及,大多数用户都以此为基础,构建网络,进行各种网络应用。同时,以太网还支持广泛的兼容设备,提供较高的数据吞吐量,而且相关配件的价格也在逐渐降低。可以预见,无论是分布式通讯,还是点对点的数据交换,从企业内部的Intranet网络到贯穿全球的Internet,都将是以太网的天下。在这种环境下,车间现场的以太网设备不仅要在同一个网络中实现控制功能,还要与企业的信息系统进行互操作。用户也需要将不同厂商的设备集成在一起。为了实现这一目标,设备所采用的应用层协议应该具备如下条件:
    基于TCP/IP以及UDP/IP协议
    使用分布式对象模型
    允许控制报文和信息报文在同一以太网中共存
    提供基于生产者/消费者通讯模式的网络服务
    满足工业自动化系统的各项要求
    能够被广大自动化设备厂商接受并实施
在工业自动化领域,实时控制能力和通用的操作性尤为重要。这些功能都可以通过TCP/UDP/IP协议在以太网上实现。
IX.    参考文献
[1] DeviceNet协议规范,版本2.0,包括勘误表4,2001年4月1日 © 1995-2001,  开放DeviceNet设备供应商协会
[2] ControlNet协议规范,版本2.0,包括勘误表2, 1999年12月31日 © 1998, 1999  ControlNet International
[3] EtherNet/IP协议规范,版本1.0,2001年6月5日 © 2000, 2001 ControlNet International及开放DeviceNet设备供应商协会

相关网站
EtherNet/IP网络专题网站    www.ethernet-ip.com
开放DeviceNet供应商协会    www.odva.org
ControlNet International协会    www.controlnet.org
IETF Internet工程任务组    www.ietf.org
CIP协议                    www.ab.com/networks/cip_pop.html
生产者/消费者通讯模式        www.ab.com/networks/producer_pop.html



胖丫

  • 精华:1帖
  • 求助:0帖
  • 帖子:126帖 | 971回
  • 年度积分:0
  • 历史总积分:1644
  • 注册:2007年7月23日
发表于:2007-08-21 10:58:00
1楼
好资料,顶上去。

茅十八

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 19回
  • 年度积分:0
  • 历史总积分:19
  • 注册:2007年9月04日
发表于:2008-02-21 11:35:00
2楼
收藏

oahuiq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 14回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2008-03-06 14:03:00
3楼
ding

oahuiq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 14回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2008-03-06 14:04:00
4楼
hao

oahuiq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 14回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2008-03-06 14:12:00
5楼
Scanner状态指示灯设计
当产品有模块灯和网络灯时,应符合EIP规范第二卷9-4要求
指示灯名称 颜色 操作 示例
模块状态 双色:红/绿 Table 9-4.1
Module Status, Mod, MS, Mod Status
网络状态
双色:红/绿 Table 9-4.2
Network Status, Net, NS,Net Status
模块指示灯状态:
指示灯状态 概述 要求
稳定灭 没有电源 如果设备不加电源,模块状态指示灯应该是稳定的熄灭状态
稳定绿色 设备可操作 如果设备处于正常运行状态,模块指示灯应该是稳定的绿色状态
闪绿 备用 如果设备还没有配置,模块状态指示灯应该是闪绿状态
闪红 次要错误 如果设备检测到一个可以恢复的次要错误,模块状态指示灯应该闪红状态。注:不正确的或矛盾的配置被认为是次要错误
稳定红 严重错误 如果设备检测到一个不可恢复的严重错误,模块状态指示灯是稳定的红色
闪绿/红 自检 当模块进行上电监测时,模块模块状态指示灯是闪绿/红状态
网络指示灯状态
指示灯状态 概述 要求
稳定灭 没上电,没有IP地址 如果设备没有IP地址(或者失电),网络状态指示灯应该是稳定灭状态
闪绿 没连接 如果设备没有建立连接,但是已经获得了一个IP地址,网络状态指示灯应该是闪绿状态
稳定绿 连接 如果设备至少建立了一个连接(即使连接到报文路由器上),网络状态指示灯应该是稳定绿状态
闪红 连接超时 如果一个或多个到该设备的连接超时,网络状态指示灯应该是闪红状态。这种状态只有当所有超时的连接重新建立或设备复位之后才会消除
稳定红 重复IP 当设备检测到它的IP地址已经在使用,网络状态指示灯应该是稳定红状态
闪绿/红 自检 当设备正在进行上电自检过程时,网络状态指示灯应该是闪绿/红状态

oahuiq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 14回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2008-03-06 14:13:00
6楼
Ethernet/iP产品分级:
最高等级scanner
其次Adapter
然后Messager

oahuiq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 14回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2008-03-06 14:17:00
7楼
从协议来看
一般实现identity object ,messager router object,assembly object,connectioin managerment object,etherlink object,tcp/ip object,port object就可以实现一个Adapter产品了

oahuiq

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 14回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2008-03-06 14:19:00
8楼
分析一小段代码
/*---------------------------------------------------------------------------
** routerProcessObjectRequest( )
**
** Process UCMM or Class 3 request 
**---------------------------------------------------------------------------
*/

void routerProcessObjectRequest( REQUEST* pRequest )
{        
    INT32       nIndex;
    UINT32      *p;
    UINT16      iTagSize;
    UINT32      iClass;
CONNECTION* pConnection = NULL;
BOOL bInternalMsg = TRUE;

    if ((pRequest->nType != OBJECT_REQUEST) && (pRequest->nType != CLASS3_REQUEST)) 
        return;

if (pRequest->nType == CLASS3_REQUEST)
{
pConnection = connectionGetFromSerialNumber( pRequest->cfg.class3Cfg.iConnectionSerialNbr, pRequest->cfg.class3Cfg.iVendorID, pRequest->cfg.class3Cfg.lDeviceSerialNbr );
#ifdef ET_IP_MODBUS
if (pConnection != NULL)
{
/* We have a Modbus connection message */
if (pConnection->cfg.modbusCfg.iModbusAddressSize > 0)
{
eipmbsParseCIPModbusRequest(pRequest);
return;
}
}
#endif
}
    
    iClass = pduGetTagByType(&pRequest->cfg.objectCfg.PDU, TAG_TYPE_CLASS, 0, &iTagSize);
    if ( iTagSize )
    {    
        for ( p = gpClientAppProcClasses; p < &gpClientAppProcClasses[glClientAppProcClassNbr]; p++ )
        {
            if ( *p == iClass )
            {            
                pRequest->nState = REQUEST_WAITING_FOR_RESPONSE;
                notifyEvent( NM_CLIENT_OBJECT_REQUEST_RECEIVED, pRequest->nIndex, 0 );
                return;
            }
        }
    }
else
{
for ( p = gpClientAppProcServices; p < &gpClientAppProcServices[glClientAppProcServiceNbr]; p++ )
{
if (*p == pRequest->cfg.objectCfg.bService )
{            
pRequest->nState = REQUEST_WAITING_FOR_RESPONSE;
notifyEvent( NM_CLIENT_OBJECT_REQUEST_RECEIVED, pRequest->nIndex, 0 );
return;
}
}

/********************** FOR DEMOSTRATION PURPOSES ONLY   ******************
if ( pRequest->cfg.objectCfg.bService == SVC_CIP_DATA_TABLE_READ ||
 pRequest->cfg.objectCfg.bService == SVC_CIP_DATA_TABLE_WRITE )
{
dataTableParseRequest( pRequest );
pRequest->nState = REQUEST_RESPONSE_RECEIVED;
return;
}
***************************************************************************/
}

    nIndex = pRequest->nIndex;

    /* Direct the request to the appropriate object - this is what Message Router does */
    switch( iClass )
    {
        case ID_CLASS:
            idParseClassInstanceRequest( pRequest );
            break;
        case ROUTER_CLASS:
            routerParseClassInstanceRqst( pRequest );
            break;
        case ASSEMBLY_CLASS:
            assemblyParseClassInstanceRqst( pRequest );
            break;
        case CONNMGR_CLASS:
            bInternalMsg = connmgrParseClassInstanceRqst( pRequest );
            break;
case PCCC_CLASS:
            bInternalMsg = pcccParseClassInstanceRqst( pRequest );
break;
#ifdef ET_IP_SCANNER
        case CONFIG_CLASS:
            configParseClassInstanceRequest( pRequest );
            break;
#endif /* #ifdef ET_IP_SCANNER */
        case PORT_CLASS:
            portParseClassInstanceRequest( pRequest );
            break;
        case TCPIP_CLASS:
            tcpipParseClassInstanceRequest( pRequest );
            break;
        case ENETLINK_CLASS:
            enetlinkParseClassInstanceRqst( pRequest );
            break;
        default:    /* Do not support this class yet */
            pRequest->bGeneralError = ROUTER_ERROR_INVALID_DESTINATION;
            break;
    }

if (!bInternalMsg) /* If message is being handled by the application, wait for the response */
return;

    /* Check that we still have the request; it could have been already completely processed and removed */
    pRequest = requestGetByRequestId( nIndex );
    if ( pRequest == NULL )
        return;                            /* Request has been removed while processing */
    
    /* Save the connected response in the connection object */
if (pRequest->nType == CLASS3_REQUEST)
{
if ( pConnection != NULL )
        {
EtIP_realloc( &pConnection->pResponseData, &pConnection->iResponseDataSize, pRequest->cfg.objectCfg.pData, pRequest->cfg.objectCfg.iDataSize );    
            pConnection->bGeneralStatus = pRequest->bGeneralError;    /* Store general status. Should be 0 in case of success */
            pConnection->iExtendedStatus = pRequest->iExtendedError;    /* Store extended status. */
}
}                           

pRequest->nState = REQUEST_RESPONSE_RECEIVED;
}

热门招聘
相关主题

官方公众号

智造工程师