2 数控系统组网设计
网络数控把与制造过程有关的设备(如数控机床)、主控计算机、通信设施等按一定的结构和层次组合起来成为一个整体,具有层次化的结构特征。如图 5 所示,网络数控系统组网可以分为三个层次:企业车间层、企业管理中心层和系统厂家管理层。数控系统配套的加工机床设备位于企业生产车间,通过网络链路设备有机连接起来,每台设备提供基本信息、系统状态和控制信息等数据。企业管理中心层是数控系统数据中心,维护管理调度生产车间每一台设备,对设备进行有效管理。系统厂家管理层建立用户数据信息库,通过 Internet 与企业用户进行连接,实时跟踪客户需求及系统运行状况,必要时可以对客户进行远程培训和维修,一定程度上减少了系统厂家的生产成本。
图 5 网络数控系统组网
网络数控系统组网与普通 PC 机局域网组网类似,将网络数控系统看成局域网内的一个节点。鉴于生产车间环境比较恶劣,组网采用超五类双绞线作为传输介质,具有串扰少、衰减小并且具有较高的衰减与串扰的比值和信噪比,性能能够得到很大提高。另外,需要额外的网络连接设备来满足服务器与多个数控系统客户端的连接。通过对比集线器、中继器和交换机性能,最后选用具有有效隔离冲突的交换机作为网络连接设备,能够为每个客户端口提供专用带宽,能够满足全双工数据传输。
3 软件设计
系统硬件架构设计中,将 OMAPL138B 作为 W5100 的主控制芯片,系统软件设计采用服务器/客户端模式。以网络数控系统作为客户端,而 PC 机充当服务器,接受客户端的连接,PC 基于 Windows7 操作系统运行,采用 Windows Socket 套接字网络编程。在对 W5100 网络芯片控制之前,微处理器首先复位上电完成初始化任务,主要完成系统及外部设备时钟初始化、系统启动运行模式及堆栈设置、中断向量表及中断控制器设置、GPIO 和 UART 等内部集成电路模块接口进行配置、系统定时器及最重要的 EMIFA 控制器工作模式和时序配置。W5100 客户端连接流程与 PC 服务器端软件流程如图 6、7 所示。
图6 W5100 客户端连接流程
图7 PC 服务器端软件流程
3.1 W5100 驱动程序设计
W5100 驱动程序设计主要包括初始化和 Socket 程序设计两部分,初始化过程主要针对关键寄存器设置实现复位、工作模式、端口选择及收发缓存大小设置等。初始化 W5100 关键步骤如下:
1) 设置模式寄存器 MR 软件复位位为 1,自动清零所有内部寄存器,同时设置 IP 地址、子网掩码、物理地址等;
2) 设置终端屏蔽寄存器 IMR 为 0xFF,开启提供的所有中断,任何时候中断寄存器 IR 对应位置 1 时,将中断 CPU,通过访问 IR 获得中断源;
3) 设置发送 TMSR 和接收 RMSR 寄存器为 0x55,使每个端口发送和接收缓存大小为 2KB;
4) 设置重发计数寄存器 RCR 为 8,设定传输过程中的重发次数;
5) 设置重发时间寄存器 RTR 为 0x07DD,即 200 毫秒,当与服务器无法响应超过 200 毫秒时,将进行重发处理;
6) 设置端口模式寄存器 Sn_MR 为 0x21,关闭广播功能并选用 TCP 模式;
7) 设置端口命令寄存器 Sn_CR,实现端口初始化、建立/断开连接和数据传输;以上就是 W5100 初始化过程,其 Socket 编程主要涉及连接、读数据和写数据操作,以下是三个关键函数实现。
由于网络数控系统作为客户端,必须与服务器端先建立连接才能进行通信,Socket_Connect 函数负责与服务器端建立连接。端口打开完成连接命令后,需要等待端口终端判断是否与远端服务器建立连接,可以参考 W5100 数据手册的 Socket 中断状态。
int Socket_Connect(int socket){ //端口号,0~3 共四个端口可选
W5100_WREG(W5100_S0_MR, S_MR_TCP|S_MR_MC); // TCP 模式,ND/MC 位置
W5100_WREG(W5100_S0_PORT, 8080); //本机端口号为 8080
ServerIPAddrSet(W5100_S0_DIPR, “192.168.1.2); //服务器 IP 地址
W5100_WREG(W5100_S0_DPORT, 8080); //服务器端口号
W5100_WREG(W5100_S0_CR, S_CR_OPEN); //打开端口
W5100_WREG(W5100_S0_CR, S_CR_CONNECT); //连接服务器
return true;
}
W5100 读操作首先从端口接收数据缓冲区读取有效数据,将接收的数据量与读指针寄存器 Sn_RX_RD 的值相加再写回 Sn_RX_RD,最后将 RECV 读命令操作标志写入端口命令寄存器 Sn_CR,完成本次读取操作,并等待下次接收。主要程序如下:
unsigned int Socket_Receive(int socket, unsigned char *buf){
unsigned int i,rx_size,rx_offset;
unsigned char *ptr;
rx_size=W5100_RREG(W5100_S0_RX_RSR ); //读取接收数据的字节数
rx_size+=W5100_RREG(W5100_S0_RX_RSR+1 );
rx_offset= W5100_RREG(W5100_S0_RX_RR); //获取接收缓存区偏移量
rx_offset+= W5100_RREG(W5100_S0_RX_RR+1);
ptr=(unsigned char*)(W5100_RX+socket*S_RX_SIZE+rx_offset);
for(i=0; i<rx_size; i++){ //读数据到缓存区
buf[i]=*ptr++;
}
W5100_WREG(W5100_S0_CR, S_CR_RECV); //设置接收命令,等待下一次接收
return rx_size; //返回接收的数据字节数
}
W5100 发送数据操作时,首先检查发送缓冲区剩余空间大小 Sn_TX_FSR,将要发送数据写入端口发送数据缓冲区后,则将发送数据长度与端口传输写指针寄存器 Sn_TX_WR 中的值相加并写入 Sn_TX_WR,最后写入发送命令 Sn_CR_SEND,完成本次发送。相关程序如下:
unsigned int Socket_Send(int socket, unsigned char *buf, int size){
unsigned int i,tx_free_size,tx_offset;
unsigned char *ptr;
tx_free_size=W5100_RREG(W5100_S0_TX_FSR ); //读取发送缓存区剩余字节
tx_free_size +=W5100_RREG(W5100_S0_TX_FSR +1 );
tx_offset= W5100_RREG(W5100_S0_TX_WR); //获取发送缓存区偏移量
tx_offset+= W5100_RREG(W5100_S0_TX_WR +1);
ptr=(unsigned char*)( W5100_TX+socket*S_TX_SIZE+tx_offset);
for(i=0; i< size; i++){ //将数据写入发送缓存区
*ptr++= buf[i];
}
W5100_WREG(W5100_S0_CR, S_CR_SEND); //设置发送命令,将数据发送出去
return size; //返回发送的数据字节数
}