哈尔滨工业大学工学硕士学位论文 (6)丢失令牌(LostToken) 如果静止计时器值大于等于Tno_token+ (127 ×Tslot) + TS×Tslot(这里TS为零配置地址),则假定令牌已经丢失。清空地址列表中所有标志和地址,设置收到有效帧为FALSE,设置收到非本站有效帧为FALSE,设置TS为255,进入零配置空闲状态等待下一帧。 3.4.3.4 零配置令牌(ZERO_CONFIGURATION_TOKEN)状态
当一个节点等待一个它先前发送主节点轮询回复帧的主节点的令牌时,进入零配置令牌状态。
(1)发往本站令牌(TokenForUs) 如果收到有效帧为TRUE,帧类型为令牌,目的地址等于TS,则证实可以使用该地址。设置收到有效帧为FALSE,调用发送帧过程发送一个测试请求帧给该节点,其地址被源地址(令牌源地址)指定,包含该帧数据部分的零配置唯一数据。进入零配置确认状态等待一个测试响应。
(2)非本站令牌帧(FrameNotTokenForUs) 如果收到有效帧为TRUE,或者收到非本站有效帧为TRUE,帧类型不是令牌,则重新开始零配置过程。清空地址列表中所有的标志和地址,设置收到有效帧为FALSE,设置收到非本站有效帧为FALSE,设置TS为255,进入零配置空闲状态等待下一帧。
(3)不正确帧(InvalidFrame) 如果收到不正确帧为TRUE,则等待下一帧。进入零配置令牌状态等待地址为本站的令牌帧。
(4)丢失令牌(LostToken) 如果静止计时器大于等于Tno_token+ (127 ×Tslot) + TS×Tslot(这里TS为零配置地址)则假定令牌已经丢失。清空地址列表中所有标志和地址,设置收到有效帧为FALSE,设置收到非本站有效帧为FALSE,设置TS为255,进入零配置空闲状态等待下一帧。 3.4.3.5 零配置确认(ZERO_CONFIGURATION_CONFIRM)状态
当一个节点等待一个测试响应帧时,进入零配置确认状态。
(1)确认超时(ConfirmationTimeout) 如果静止计时器大于等于Tconfirmation_timeout,则使用该地址。设置PS为TS,设置NS为TS(下一个节点未知),设置重发计数器和事件计数器为0,设置令牌计数器为Npoll(致使当该节点第一次收到令牌发送一个主节点轮询),设置单一主节点为FALSE,进入主节点轮询状态去发现TS的新的后续节点。
(2)不正确帧(InvalidFrame) 如果静止计时器小于Tconfirmation_timeout,收到不正确帧为TRUE,则一个不正确帧被接收到。设置收到不正确帧为FALSE,清空地址列表中所有标志和地址,设置TS为255,进入零配置空闲
- 29 -
哈尔滨工业大学工学硕士学位论文 状态等待下一帧。
(3)确认成功(ConfirmationSuccessful) 如果静止计数器小于Tconfirmation_timeout,收到有效帧为TRUE,帧类型为测试请求,测试请求中发送的数据匹配,则使用该地址。设置PS为TS,调用发送帧过程发送一个令牌帧给NS(通过查看带有令牌标记地址列表记录),设置重发计数器和事件计数器为0,设置令牌计数器为1,进入传递令牌状态。
(4)确认失败(ConfirmationFailed) 如果静止计数器小于Tconfirmation_timeout,收到有效帧为TRUE,帧类型为测试响应,测试请求发送的数据不匹配,或者帧类型不是测试响应,则重新开始。设置收到有效帧为FALSE,清空地址列表的所有标志和地址,设置TS为255,进入零配置空闲状态等待下一帧。
3.4.3.6 空闲、等待回复和主节点轮询状态
(1)收到来自本站有效帧(ReceivedValidFrameFromUs) 如果收到非本站有效帧为TRUE,源地址等于TS,零配置主节点为TRUE,则另一节点正使用该零配置地址。设置收到非本站有效帧为FALSE,清空地址列表中所有标志和地址,设置TS为255,进入零配置空闲状态等待下一帧。
(2)收到非本站有效帧(ReceivedValidFrameNotForUs) 如果收到非本站有效帧为TRUE,且源地址不等于TS,且零配置主节点为TRUE,或零配置主节点为FALSE,则放弃该帧。设置收到非本站有效帧为FALSE,进入空闲状态等待下一帧。
3.5 零配置MAC地址软件实现
(1)用枚举型表示自动MAC寻址的状态,如下: typedef enum {
AUTOMAC_STATE_IDLE = 0, AUTOMAC_STATE_PFM = 1, AUTOMAC_STATE_TOKEN = 2, AUTOMAC_STATE_TESTING = 3, AUTOMAC_STATE_CONFIRM = 4, } AUTOMAC_STATE;
对应上一节状态机,加入了一个自动地址测试状态,实际上该状态只是发送一个测试帧,以待自动地址确认状态对该测试帧一个回复一个测试响应帧,以便确定自分配地址。
- 30 -
哈尔滨工业大学工学硕士学位论文 (2)为了监听网络中的地址使用情况,而且追踪令牌和主节点轮询帧以便维护令牌环,对自动地址数据定义了几个标记符,用结构体表示如下:
typedef struct {
/* 主节点轮询标记符表示监听的帧目的地址未被使用*/ bool pfm:1;
/* 一个设备发送帧,表示该帧的源地址已经被使用,不能作为自动地址分配的地址选择对象*/
bool emitter:1;
/* 令牌标识符,表示该地址有令牌传递,以便发现对等实体 */ bool token:1;
/* 一部分地址留给固定地址节点,本算法的地址0到64保留
给固定地址节点*/
bool reserved:1; } AUTO_MAC_DATA;
(3)主节点在上电或重启时无条件的进入初始化状态。在初始化状态,如果节点帧地址不可知,TS为255地址,会调用自动地址状态机处理程序中。下面是它的简要程序:
void dlMS/TP_automac_hander( void ) {
static AUTOMAC_STATE state = AUTOMAC_STATE_IDLE; uint8_t mac = 0;
/* 节点的序列号和生产商ID用于确认自动分配的地址时,包含在测试请求和测试响应帧中*/ uint32_t serial_number = 0; uint16_t vendor_id = 0;
/* take_address做为一个自动地址分配成功与否的标记,start_over是需要进入自动地址空闲状态重新开始分配地址的标记/* bool take_address = false; bool start_over = false;
/*在空闲状态,节点监听网络,有帧传输时说明源地址被使用。当自动地址的主节点轮询完毕后,选择到一个可用的自动分配地址时,进入自动地址主节点轮询状态。如果丢失令牌则直接进入自动地址测试状态。/*
- 31 -
哈尔滨工业大学工学硕士学位论文 switch (state) {
case AUTOMAC_STATE_IDLE:
if ((MS/TP_Flag.ReceivedValidFrame) ||
(MS/TP_Flag.ReceivedValidFrameNotForUs)) {
…
} else if (automac_pfm_cycle_complete()) { mac = automac_free_address_random(); if (automac_free_address_valid(mac)) { automac_address_set(mac); state = AUTOMAC_STATE_PFM;
} else if (rs485_silence_elapsed(automac_time_slot())) { SourceAddress = automac_address(); state = AUTOMAC_STATE_TESTING; } break;
/*在自动地址主节点轮询状态,发送一个主节点轮询回复帧给源地址,进入自动地址令牌状态,将会收到一个令牌帧。希望声明地址的节点将发送一个测试请求帧。该测试请求帧会包含该节点唯一的序列号和生产商ID,这将使得在自动地址确认状态主节点轮询和令牌发送节点回复一个包含该唯一信息的测试响应。/*
case AUTOMAC_STATE_PFM: … break;
case AUTOMAC_STATE_TOKEN: … break;
case AUTOMAC_STATE_TESTING: … break;
case AUTOMAC_STATE_CONFIRM: … break;
- 32 -
哈尔滨工业大学工学硕士学位论文 /*如果地址确认成功,则调用发送一个令牌帧给下一站,进入令牌传递状态,参与正常的令牌环。/*
if (take_address) {
This_Station = automac_address();
DestinationAddress = automac_next_station(This_Station); if (DestinationAddress < 128) {
MS/TP_Send_Frame(FRAME_TYPE_TOKEN,
DestinationAddress,
This_Station, NULL, 0); } … break; }
}
3.6 本章小结
本章首先介绍了MS/TP传统地址设定方法,它们需要通过附加的硬件和软件工具,而且有些存在人工误操作,有些又成本昂贵、操作不便。然后,针对传统MAC地址设定方式的缺陷,本章研究了一种零配置MS/TP MAC地址的算法,不需要用到硬件(拨码开关等)就可以配置MS/TP设备的MAC地址。它是通过改进的接收帧状态机和主节点状态机来实现的。最后,本章详细描述了零配置MAC地址算法的相关状态和状态之间的转换,并简要给出了该自动寻址算法的软件实现方法。
- 33 -