之前写的乱七八糟一大堆4
Modbus 协议是应用于 电子控制器上的 一种通用语言。
通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。
它已经成为一通用工业标准。
有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
此协议定义了一个 控制器能认识使用的 消息结构, 而不管它们是经过 何种网络进行通信的。
现在Modbus已经是工业领域全球最流行的协议。
此协议支持传统的RS-232、RS-422、RS-485和以太网设备。
许多工业设备,包括PLC,DCS,智能仪表等 都在使用Modbus协议 作为他们之间的通讯标准。
Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。
标准的Modicon控制器使用RS232C实现串行的Modbus。
Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,
数据通讯采用Maser/Slave方式。
串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,
但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。
-------------------------------------------------------------------------------------------------------
它描述了一控制器请求访问其它设备的过程,
以及如何回应来自其它设备的请求,以及怎样侦测错误并记录。
它制定了消息域格局和内容的公共格式。
当在一Modbus网络上通信时,
此协议决定了 每个控制器 须要知道它们的设备地址,
识别 按地址发来的消息,决定要产生何种行动。
如果需要回应,控制器将生成反馈信息 并用Modbus 协议发出。
在其它网络上,包含了 Modbus 协议的消息转换为 在此网络上使用的帧或包结构。
这种转换也扩展了 根据具体的网络 解决 节地址、路由路径及错误检测的方法。
1.频率
/**根据需要的频率,求得单次高低电平的周期,再以50%占空比输出。**/
//设定开关频率 相当于 模拟输出一个pwm波,eg:100hz 50%
?
void led_frequency_ctrl(void)
{
period = 1/frequency*1000; //1
if(CheckDelay((uint32_t*)&time_f)==0)
{
Set_Delay_Time(period,(uint32_t*)&time_f); //1
}
if(time_f <= period/2) //2
{
PAout(1) = 1;
MP_ModBus1.Hold_Reg[2] = 0;
}
else
{
PAout(1) = 0;
MP_ModBus1.Hold_Reg[2] = 1;
}
}
?
?
/**之后再1ms调用**/
static void Task_1ms(void)
{
DelayTimeCount_ms((uint32_t*)&time_f); //!!!
TimeCountReceive(&U_D_Uart2);
}
?
注:主机只需要发什么功率什么频率以及读取已经处理好的监控值,真正控制处理灯的是从机。
例如:
第三功能,需要只在开灯情况下读取监控值,那么就让从机只在开灯状态才存入就好,这样主机获取的都是开灯状态下的值,不需要自己在判断。
再例如:
设定频率,主机只需要告诉从机,你要以多大频率开关灯,从机得知后自主转换控制频率。而不是之前,主机亲自控制每一次开关达到控制频率效果,复杂而且通信量很大出错率也高。
/**主机**/
/**实现3/4个功能:1.灯开关频率设定 2.功率设定 3.读取监控值**/
?
?
?