【摘要】:在这种过程中,下列SAPs服务于DP方式。·SAP53:DDB参数设置报文选择。DP从站协议完全集成在SPC3中,并独立执行。用户必须相应地参数化SPC3,处理和响应传送报文。除了Default SAP、SAP56、SAP57和SAP58,其他的SAPs一直使能,这4个SAPs在DP从站状态机制进入数据交换状态才使能。用户也可以让SAP55无效,这时相应的缓存器指针R_SSA_Buf_Ptr设置为00H。在RAM初始化时可以让DDB单元无效。值得庆幸的是,PROFIBUS-DP的通信速率可以设置得比较快。
1.DP缓存器结构
DP_Mode=1(参见方式寄存器0)时,SPC3 DP方式使能。在这种过程中,下列SAPs服务于DP方式。
·Default SAP:数据交换(Write_Read_Data)。
·SAP53:DDB参数设置报文选择(Set_DDB_Param)。
·SAP55:改变站地址(Set_Slave_Address)。
·SAP56:读输入(Read_Inputs)。
·SAP57:读输出(Read_Outputs)。
·SAP58:DP从站的控制命令(Global_Control)。
·SAP59:读配置数据(Get_Config)。
·SAP60:读诊断信息(Slave_Diagnosis)。
·SAP61:发送参数设置数据(Set_Param)。
·SAP62:检查配置数据(Check_Config)。
DP从站协议完全集成在SPC3中,并独立执行。用户必须相应地参数化SPC3,处理和响应传送报文。除了Default SAP、SAP56、SAP57和SAP58,其他的SAPs一直使能,这4个SAPs在DP从站状态机制进入数据交换状态才使能。用户也可以让SAP55无效,这时相应的缓存器指针R_SSA_Buf_Ptr设置为00H。在RAM初始化时可以让DDB单元无效。
DP_SAP缓存器结构如图5-1所示。
图5-1 DP-SAP结构
用户可在离线状态下配置所有的缓存器(长度和指针),在操作中除了Dout/Din缓存器长度外,其他的缓存配置不可改变。
用户在配置报文以后(Check_Config),等待参数化时,仍可改变这些缓存器。在数据交换状态下只可接收相同的配置。
输出数据和输入数据都有3个长度相同的缓存器可用,这些缓存器的功能是可变的。一个缓存器分配给D(数据传送),一个缓存器分配给U(用户),第3个缓存器出现在N(Next State)或F(Free State)状态,然而其中一个状态不常出现。
两个诊断缓存器长度可变。一个缓存器分配给D,用于SPC3发送数据;另一个缓存器分配给U,用于准备新的诊断数据。
SPC3首先为不同的参数设置报文(Set_Slave_Address和Set_Param)和配置报文(Check_Config),并读取到辅助缓存1和辅助缓存2中。
对于SPC3,输入缓冲区有3个,并且长度一样;输出缓冲区也有3个,长度也一样。输入、输出缓冲区都有3个状态,分别是U、N、D。在同一时刻,各个缓冲区处于相互不同的状态。08H~0BH单元表明了各个缓冲区的状态,并且表明了当前用户可用的缓冲区。U状态的缓冲区分配给用户使用,D状态的缓冲区分配给总线使用。N状态是U、D状态的中间状态。
(1)输出数据缓冲区状态的转变
当持有令牌的主站向本地从站发送输出数据时,SPC3在D缓存中读取接收到的输出数据。当SPC3接收到的输出数据没有错误时,就将新填充的缓冲区由D状态转为N状态,并且产生DX_OUT中断。这时用户读取Next_Dout_Buffer_Cmd寄存器,处于N状态的输出缓冲区由N状态变为U状态;用户同时知道哪一个输出缓冲区处于U状态,通过读取输出缓冲区得到当前输出数据。
如果用户程序循环时间短于总线周期时间,也就是说用户非常频繁地查询Next_Dout_Buffer_Cmd寄存器。用户使用Next_Dout_Buffer_Cmd寄存器在N状态下得不到新缓存,因此,缓存器的状态将不会发生变化。在12Mbit/s情况下,用户程序循环时间长于总线周期时间,这就有可能使用户取得新缓存之前在N状态下得到输出数据,保证了用户能得到最新的输出数据。但是,在通信速率比较低的情况下,只有在主站得到令牌,并且与本地从站通信后,用户才能在输出缓冲区中得到最新数据。如果从站比较多,输入、输出的字节数又比较多,用户得到最新数据通常要花费很长的时间。值得庆幸的是,PROFIBUS-DP的通信速率可以设置得比较快。
用户通过读取Dout_Buffer_SM寄存器(地址0AH)的状态,可以查询每个输出缓冲区处于Nil、Dout_Buf_Ptr1-1、Dout_Buf_Ptr1-2、Dout_Buf_Ptr1-3中的哪个状态。
用户读取Next_Dout_Buffer_Cmd(地址0BH)寄存器,可以得到交换后哪一个缓存处于U状态,即属于用户,或者没有发生缓冲区变化。然后用户可以从处于U状态的输出数据缓冲区中得到最新的输出数据。
(2)输入数据缓冲区状态的转变
输入数据缓冲区有3个,长度一样(初始化时已经规定)。输入数据缓冲区也有3个状态,即U、N、D状态。同一时刻,3个缓冲区处于不同的状态,即一个缓冲区处于U状态,一个处于N状态,一个处于D状态。处于U状态的缓冲区用户可以使用,并且在任何时候用户都可以更新;处于D状态的缓冲区由SPC3使用,SPC3将处于D状态缓冲区中的输入数据发送到主站。
SPC3从D缓存中发送输入数据。在发送以前,处于N状态的输入缓冲区转为D状态,同时处于U状态的输入缓冲区变为N状态,原来处于D状态的输入缓冲区变为U状态。处于D状态的输入缓冲区中的数据发送到主站。用户可使用U状态下的输入缓冲区,通过读取New_Din_Buffer_Cmd寄存器,用户可以知道哪一个输入缓冲区属于用户。如果用户赋值周期时间短于总线周期时间,将不会发送每次更新的输入数据,只能发送最新的数据。但在12Mbit/s速率下,用户赋值时间长于总线周期时间。在此时间内,用户可多次发送当前的最新数据。但是在波特率比较低的情况下,不能保证每次更新的数据都能及时发送。用户把输入数据写入处于U状态的输入缓冲区,只有U状态变为N状态,再变为D状态,SPC3才能将该数据发送到主站。
用户通过读取Din_Buffer_SM(08H)单元,可以查询每个输入缓冲区处于Nil、Din_Buf_Ptr1-1、Din_Buf_Ptr1-2、Din_Buf_Ptr1-3中的哪个状态。
读取New_Din_Buffer_Cmd寄存器(地址09H),用户可得到交换后哪一个缓存属于用户。与相应的目标缓存器(SSA缓存器、PRM缓存器和CFG缓存器)交换数据时,相互交换的缓存器必须有相同的长度,用户可在R_Aux_Buf_Sel参数单元定义中使用上述哪一个辅助缓存。辅助缓存器1一直可用,辅助缓存器2可选。如果DP报文的数据不同,比如设置参数报文长度大于其他报文,则使用辅助缓存器2(Aux_Sel_Set_Param=1),其他的报文则通过辅助缓存器1(Aux_Sel_Set_Param)读取。如果缓存器太小,SPC3将响应“无资源”。
辅助缓存器管理见表5-12。
表5-12 辅助缓存器管理
用户可用Read_Cfg缓存器读取Get_Config缓存中的配置数据,但二者必须有相同的长度。
在D状态下,可以从Din缓存器中进行Read_Input_Data操作;在U状态下,可以从Dout缓存器中进行Read_Output_Data操作。
由于SPC3内部只有8位地址寄存器,因此,所有的缓存器指针都是8位段地址。访问RAM时,SPC3将段地址左移3位,与8位偏移地址相加,得到11位物理地址。关于缓存器的起始地址,这8个字节是明确规定的。
2.DP服务描述
(1)Set_Slave_Address(SAP55)
1)Set_Slave_Address顺序。
用户通过设置R_SSA_Buf_Ptr=00H,使设定从站地址顺序的功能失效,必须确定从站地址。例如,可通过拨码开关读取站地址,写入R_TS_Adr寄存器。
用户也可以使用非易失存储器(如E2PROM)支持这种功能。在外部E2PROM中,可以存储从站地址和Real_No_Add_Change(True=FFH)参数。由于电源故障造成系统重启时,用户必须重新装载R_TS_Adr和R_Real_No_Add_Change寄存器。
如果SAP55使能,并且Set_Slave_Address报文已正确接收,SPC3把网络数据放入Aux-Buffer1/2中,然后把Aux-Buffer1/2转换为SSA缓存器,将数据长度存放到R_Len_SSA_data中,产生New_SSA_Data中断,并存储新的站地址和新的Real_No_Add_Change参数。用户不必再把改变的参数传送给SPC3。当用户读取该缓存器后,用户就可以对地址14H执行读操作,使用SSA_Buffer_Free_Cmd,让SPC3再次准备好接收新的设置从站地址的报文(如来自其他的主站)。
当有错误产生时,SPC3能独立响应。
SSA_Buffe r_Free_Cmd编码见表5-13。
表5-13 SSA_Buffer_Free_Cmd编码
2)Set_Slave_Address报文结构。
SSA缓存器中网络数据的存储格式见表5-14。
表5-14 SSA缓存器中网络数据的存储格式
(2)Set_Param(SAP61)
1)参数数据结构。
SPC3给前7个字节赋值(不包括用户参数数据),或给前8个字节赋值(包括用户参数数据),前7个字节是按标准规定的,第8个字节与SPC3特殊参数有关。其余字节与应用有关。Set_Param报文的数据格式见表5-15。
表5-15 Set_Param报文的数据格式
Set_Param报文数据第7个字节的位定义见表5-16。
表5-16 Set_Param报文数据第7个字节的位定义
2)参数数据处理顺序。
在多于7个数据字节有效的情况下,SPC3执行以下响应:
SPC3把辅助缓存器1/2(所有的数据都输入到这里)转换为参数缓存器,把输入数据的长度存储到R_Len_Prm_Data,并触发New_Prm_Data中断。用户必须检查User_Prm_Data,返回值为User_Prm_Data_Okay_Cmd或User_Prm_Data_Not_Okay_Cmd。所有的报文都输入到该缓存中,也就是与应用有关的参数数据只存储在从第8个字节开始的单元中。
用户响应(User_Prm_Data_Okay_Cmd或User_Prm_Data_Not_Okay_Cmd)触发New_Prm_Data中断,在IAR寄存器中用户不响应该中断。User_Prm_Data_Not_Okay_Cmd报文设置相关的诊断位,并转入Wait_Prm。
User_Prm_Data_Okay_Cmd和User_Prm_Data_Not_Okay_Cmd可进行读访问,相关信号如下:
User_Prm_Finished当前无其他的参数报文
Prm_Conflict当前有其他的参数报文,再一次处理
Not_allowed当前总线状态下不允许访问
User_Prm_Data_Okay_Cmd编码和User_Prm_Data_Not_Okay_Cmd编码分别见表5-17和表5-18。(www.chuimin.cn)
表5-17 User_Prm_Data_Okay_Cmd编码
表5-18 User_Prm_Data_Not_Okay_Cmd编码
如果同时接收到其他的Set_Param报文,将返回Prm_Conflict信号以响应第一个报文。无论是肯定响应,还是否定响应,此时SPC3新的参数缓存器都可用,用户可以重新响应新的Set_Param报文。
(3)Check_Config(SAP62)
用户给配置数据赋值。SPC3接收到有效的Check_Config报文后,SPC3把辅助缓存器1/2(所有的数据都输入到这里)转换成配置缓存器,把输入数据的长度存储到R_Len_Cfg_Data中,并产生New_Cfg_Data中断。
用户必须检查User_Config_Data寄存器,返回值为User_Cfg_Data_Okay_Cmd或User_Cfg_Data_Not_Okay_Cmd(对Cfg_SM的响应),网络数据按标准格式输入到该缓存器中。
用户响应(User_Cfg_Data_Okay_Cmd或User_Cfg_Data_Not_Okay_Cmd)产生New_Cfg_Data中断,在IAR寄存器中用户不响应该中断。
如果配置不正确,则改变诊断位,并转入Wait_Prm。
对于正确的配置,如果当前无Din缓存器(R_Len_Din_Buf=00H),并且参数设置报文和配置报文的触发计数器为0,则立即进入数据交换状态。否则,只有使用New_Din_Buffer_Cmd使N缓存器可用后才进入数据交换状态。当进入数据交换状态时,SPC3产生Go/Leave_Data_Exchange中断。
如果从配置缓存器中接收到正确的配置数据,将导致Read_Cfg缓存器的变化(该变化包括Get_Config报文的数据),用户必须在User_Cfg_Data_Okay_Cmd响应之前使Read_Cfg缓存器中的Read_Cfg数据可用。SPC3接收到响应之后且方式寄存器1中的EN_Change_Cfg_Buffer=1,则交换Cfg缓存器和Read_Cfg缓存器。
在响应期间,用户可接收有冲突的信息和无冲突的信息。如果处理第一个Check_Config报文的同时接收到其他的Check_Config报文,将返回Check_Conflict信号以响应第一个报文。无论是肯定响应,还是否定响应,此时SPC3新的参数缓存器都可用,用户可以重新响应新的Set_Cfg报文。
可以对User_Cfg_Data_Okay_Cmd和User_Cfg_Data_Not_Okay_Cmd单元进行读操作,返回值为Not_Allowed、User_Cfg_Finished和Cfg_Conflict。如果在上电过程中同时出现New_Prm_Data和New_Cfg_Data,用户必须先响应Set_Param,然后再响应Check_Config。
User_Cfg_Data_Okay_Cmd编码和User_Cfg_Data_Not_Okay_Cmd编码分别见表5-19和表5-20。
表5-19 User_Cfg_Data_Okay_Cmd编码
表5-20 User_Cfg_Data_Not_Okay_Cmd编码
(4)Slave_Diagnosis(SAP60)
1)诊断处理顺序。诊断有两个缓存器可用,这两个缓存器均可以改变长度。SPC3有一个缓存器用于发送诊断请求,同时用户在另外一个缓存器中预处理诊断数据。如果新的诊断数据将被发送,用户可使用New_Diag_Cmd请求交换诊断缓存器。用户通过Diag_Buffer_Changed中断确认诊断缓存器的交换。
当缓存器交换以后,将设置内部的Diag_Flag位。如果Diag_Flag激活,SPC3将在下一个Write_Read_Data具有高优先级响应数据时响应主站,表明从站已经存在诊断数据,这时主站可以使用Slave_Diagnosis报文得到从站的诊断数据,并使Diag_Flag复位。然而,如果Diag.Stat_Diag=1(静态诊断,见诊断缓存器的结构),当相关主站得到诊断数据以后,Di-ag_Flag仍保持激活状态。用户可以在新旧数据交换以前通过状态寄存器中的Diag_Flag状态判断主站是否得到了诊断数据。
诊断缓存器的状态代码存储在Diag_Buffer_SM处理器参数中。Diag_Buffer_SM分配见表5-21。
表5-21 Diag_Buffer_SM分配
New_Diag_Buffer_Cmd通过读访问,可以确定在缓存器交换后哪一个处理器参数属于用户,或者两个缓存器都分配给SPC3(No Buffer、Diag_Buf1和Diag_Buf2)。New_Diag_Buffer_Cmd编码见表5-22。
表5-22 New_Diag_Buffer_Cmd编码
2)诊断缓存器的结构。用户传送的SPC3的诊断缓存器的结构见表5-23。除了第一个字节的低3位,前6个字节都是Spaceholder,第一个字节的低3位分别是Diag.Ext_Diag、Diag.Stat_Diag和Diag.Ext_Diag_Overflow,其余的位自由安排。当发送时,SPC3按标准预处理前6个字节。
表5-23 SPC3诊断缓存器的结构
用户在SPC3内部诊断数据后,必须把Ext_Diag_Data输入到缓存器中,有3种不同格式:Device-related、ID-related和Port-related。除了Ext_Diag_Data,缓存器长度还包括SPC3的诊断字节(R-Len_Diag_Buf1和R_Len_Diag_Buf2)。
(5)Write_Read_Data/Data_Exchange(Default_SAP)
1)写输出(Writing Outputs)。SPC3读取D缓存器中的输出数据。SPC3接收到正确的输出数据报文后,SPC3将D缓存器的数据填入到N缓存器中,同时产生DX_OUT中断。这时用户从N中得到当前的输出数据,通过Next_Dout_Buffer_Cmd使缓存器由N变为U,这时当前使用数据返回到主站的Read_Outputs。
如果用户程序周期短于总线周期,则用户通过Next_Dout_Buffer_Cmd在N缓存器中找不到新的缓存器,因此,禁止缓存器交换。在通信速率为12Mbit/s情况下,用户程序周期长于总线周期,这就使用户在得到新的缓存器之前从N中得到新的输出数据,从而保证用户能得到最新的数据。
由于Power_On、Leave_Master和Global_Control_Telgram清除,SPC3清除D缓存器,然后将D缓存器的内容填入到N缓存器。在上电期间(进入Wait_Prm状态)也会发生以上情况。如果用户得到这一缓存器,它将在Next_Dout_Buffer_Cmd期间清除U缓存器。如果在Check_Config报文后,用户打算增多输出数据,则必须在N状态下删除(可能只在Wait_Cfg状态的上电期间)。
如果Diag.Sync_Mode=1,当接收到Write_Read_Data报文时,D缓存器可被填充,但不会交换,可能在下一个Sync或Unsync交换。
用户可读取缓存器管理的状态,有4种状态:Nil、Dout_Buf_Ptr1-1、Dout_Buf_Ptr1-2和Dout_Buf_Ptr1-3,当前数据指针在N状态下。Dout_Buffer管理见表5-24。
表5-24 Dout_Buffer管理
用户读取Next_Dout_Buffer_Cmd后,可得到用户缓存器的信息,判断缓存器是否发生变化,或发生变化后哪一个缓存器属于用户。Next_Dout_Buffer_Cmd编码见表5-25。
表5-25 Next_Dout_Buffer_Cmd编码
用户必须在初始化时清除U缓存器,保证在第一个数据周期之前为Read_Output报文发送定义好的数据。
2)读输入(Reading Inputs)。SPC3从D缓存器中发送输入数据。在发送以前,SPC3从N缓存器得到Din缓存器数据,然后放到D缓存器中。如果当前N状态下无新的输入数据,将没有变化。
用户使U缓存器中新的数据可用,通过New_Din_Buffer_Cmd,缓存器从U变为N。若用户的准备周期短于总线周期,则不会发送全部的输入数据,而只发送当前数据。在12Mbit/s的通信速率下,如果用户准备时间长于总线周期时间,用户可连续多次发送相同的数据。
在Start-Up期间,所有的参数报文和配置报文得到确认以后,SPC3进入数据交换状态。用户可通过New_Din_Buffer_Cmd在N缓存器中得到第一个有效的Din缓存器。
如果Diag.Freeze_Mode=1,在发送之前没有缓存器交换。
用户可读取状态机单元的状态,有4种状态:Nil、Dout_Buf_Ptr1、Dout_Buf_Ptr2和Dout_Buf_Ptr3,当前数据指针在N状态下。数据输入缓存管理见表5-26。
表5-26 数据输入缓存管理
当读取New_Din_Buffer_Cmd时,用户可得知交换后哪一个缓存属于用户。New_Din_Buffer_Cmd编码见表5-27。
表5-27 New_Din_Buffer_Cmd编码
3)用户看门狗定时器(User_Watchdog_Timer)。当上电(在数据交换状态)后,如果用户没有读取接收到的Din缓存器中的数据或没有使新的Dout缓存器可用时,SPC3继续响应Write_Read_Data报文。如果用户处理器故障,主站将接收不到该信息。因此,需要在SPC3中执行User_Watchdog_Timer。
User_WD_Timer是一个内部为16位的RAM单元,起始值是R_User_WD_Value15…0。用户每从SPC3中接收到一个Write_Read_Data报文,该RAM单元的值就减1。如果定时器达到0000H,SPC3就进入Wait_Prm状态,DP_SM产生Leave_Master,用户必须周期性地设置定时器的初始值。因此,必须在方式寄存器1中设置Res_User_WD=1。直至接收到下一个Write_Read_Data报文,SPC3把User_Wd_Timer的值装载到R_User_Wd_Value15…0中,并设置Res_User_Wd=0(方式寄存器1)。在Power_Up期间,用户必须设置Res_User_Wd=1,才能使User_Wd_Timer设置为参数化值。
(6)Global_Control(SAP58)
Global_Control报文的第一个有效字节存储在R_GC_Command RAM单元,内部处理该报文第二个字节(Group_Select)。Global_Control报文数据格式见表5-28所示。
表5-28 Global_Control报文数据格式(地址3CH)
如果接收到最后一个Global_Control报文时,Control_Command字节改变,SPC3产生New_GC_Command中断。在初始化过程中,SPC3预先设置R_GC_Command RAM单元为00H,用户可读写该单元。
只有在方式寄存器中使同步和锁定使能,才能执行以上功能。
(7)Read_Inputs(SAP56)
SPC3得到输入数据,就像处理Write_Read_Data报文一样。在发送之前,缓存器由N转为D。如果在N缓存器中有新的输入数据,并且Diag.Freeze_Mode=1,将无缓存器改变。
(8)Read_Outputs(SAP57)
SPC3在U缓存器中从Dout缓存器中得到输出数据。在启动期间应预先设置输出数据为0,才能发送有效的数据。如果在调用和重复期间,缓存器由N变为U(通过Next_Dout_Buffer_Cmd),则在重复期间发送新的输出数据。
(9)Get_Config(SAP59)
用户在Read_Cfg缓存器中得到有效的配置数据。在Check_Config报文后,配置数据发生变化,用户可以把变化后的配置数据写入配置缓存器中,置En_Change_Cfg_Buffer=1(见方式寄存器1),SPC3交换Cfg缓存器与Read_Cfg缓存器。如果在操作中配置数据发生变化,用户必须通过Go Offline返回到Wait_Prm状态。
相关推荐