以CP341为例的modbusRTU免狗主站功能块教程130701(工业级设计标准,DCS特性,真正完美的免狗通信功能块)问:为什么已经有了西门子官方的Modbus通信解决方案却还要选择免狗功能块?答:因为官方的价格有点贵、编程有点繁锁、功能过于简单!1、官方ModbusRTU主站示例程序相对复杂,占用中间变量多,从站多时就显得相当繁琐。2、官方不支持CP340卡件的ModbusRTU通信;3、官方不支持对主站命令报文先进行智能分析判别后再发送;4、官方不支持对各从站通信故障判别并产生相应故障状态标志位供用户直接调用;5、官方不支持在CPU运行时对暂无需进行通信的从站地址进行动态屏蔽;6、官方不支持ModbusRTU测试功能08号功能码;7、官方没有独立的主站通信功能块来简化编程工作量,依靠发送接收块的调用来拼凑实现;8、官方只能在轮询模式下对从站发出命令,不支持随机模式,更不支持批量随机模式一:硬件接线1、确认是从CP341卡的DB15接口4(-)脚及11(+)脚引出两根信号线,并注意正负极;2、在485线型网络两端(信号线路相距最远的两个通信端口上)需并联终端电阻(120欧~330欧)。根据传输线理论,终端电阻可以吸收网络上的反射波,有效地增强信号强度;3、如果CP卡有发送时则TX灯会闪亮,如果CP卡有接收时则RX灯会闪亮;二:ModM_34x示例程序移植至当前STEP7工程项目将上图中所示的FB块,FC块,DB块拷入工程项目中,VAT表可以不拷贝,本例在OB1中调用FC171块,注意上图的8个DB块是与示例程序FC171中FC190管脚上指定的DB块一一对应的,各位可以根据需要自已定义或修改DB块序号及DB块存储空间的大小,但一定要注意开辟的DB块的大小要符合通信要求:例如想要读模拟量40101~40104的值并放入DBxxx.DBW0~DBxxx.DBW6,那么DB块至少要开辟4个字的大小,并将FC190功能的DB_Offset管脚偏移值设为0(偏移值可根据实际需要自行设定);例如想要读数字量00101~00116的值并放入DBxxx.DBx0.0~DBxxx.DBx1.7,那么DB块至少要开辟16个位的大小,并将FC190功能的DB_Offset管脚偏移值设为0(偏移值可根据实际需要自行设定);三:程序移植后当前工程项目涉及到的STEP7硬件组态1、配置CP卡的地址,使其与FC161中FB161管脚上的LADDR一致;2、双击CP卡弹出下图对话框,若Parameters按钮灰化,则需安装CP卡驱动程序;3、双击上图Parameters,弹出下图对话框,将Protocol配置为ASCII;4、双击上图Protocol,弹出下图对话框,按实际要求设置通信基本参数;5、点击上图Transfer翻页,弹出下图对话框,配置成下图所示;6、点击上图ReceivingData翻页,弹出下图对话框,配置成下图所示;7、点击上图interface翻页,弹出下图对话框,配置成下图所示;四:程序移植后当前工程项目涉及到的STEP7软件编程1、下图所示的程序中,当鼠标停留在FB171或FC190相应管脚上时,会有中文提示弹出,FB171为主站功能块,其中DB171是其背景数据块,FC190为主站命令配置块,主站所有实施的工作内容由一系列配置好参数的FC190来实施;2、FB171管脚说明:License1、License2:H系统或软冗余系统,分别填上对应于这两个CPU的授权号,单CPU系统则两处填同一个授权号;CLOCK_CPU:与CPU的硬件组态中CLOCK的设定需一致;LADDR:CP卡的地址,与硬件组态中CP卡的地址一致;CP_Type:CP卡类型,1为CP340,2为CP341;DBInstNo:FB171所对应的背景数据块号;PollNum:轮询命令的条数,也就是执行轮询设置的FC190的数量,在示例程序中FC190的pollNO管脚值从1~8共有8条,因此FB171的PollNum管脚也设为8;PollTime:至发送下一条命令的最长等待时间(600~18000ms);WrtNum:随机操作命令的条数,也就是执行随机操作设置的FC190的数量,在示例程序中FC190的WrtNO管脚值从1~8共有8条,因此FB171的WrtNum管脚也设为8;WrtTime:至发送下一条命令的最长等待时间(600~18000ms);3、FC190管脚说明:DBInstNO:指定FB171的背景数据块号,示例程序中背景数据块为DB171,因此设为171;PollNO:轮询命令的序号,当与FB171的不断循环递增的当前序号相同时,本条命令被发出;WrtNO:随机操作命令的序号,当FB171的背景数据块中对应的随机操作位被置1时,本条命令被发出,随机操作命令的序号与FB171的背景数据块中对应的随机操作位是一一对应的关系,随机操作命令优先级高于轮询操作;DataDBNO:此条命令所对应的主站数据存取DB编号;DB_Offset:Modbus数据存取相对DB的偏移量(数字量以bit计0~16383,模拟量以word计0~8191),根据各自的需要自行设定;SndAddr:此条命令所对应的从站地址;SndFnCode:此条命令所对应的功能码;SndBeg:此条命令所对应的起始地址(L#0~L#65535));SndNum:此条命令所对应的需读写的数据数量(数字量最大:读2000,写1968)(模拟量最大:读125,写123);4、示例程序中8条FC190轮循命令的解释:轮循命令时功能码为1,读取一个或多个线圈状态:--》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=1对应)等于1时,读取1#从站00001~00024计24个线圈状态,读取到的数据放入到DB10中,因为偏移为0,所以对应于DB10.DBX0.0~DB10.DBX2.7;轮循命令时功能码为2,读取一个或多个输入状态:--》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=2对应)等于2时,读取1#从站10001~10024计24个输入状态,读取到的数据放入到DB11中,因为偏移为0,所以对应于DB11.DBX0.0~DB11.DBX2.7;轮循命令时功能码为3,读取一个或多个保持寄存器:--》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=3对应)等于3时,读取1#从站40001计1个保持寄存器,读取到的数据放入到DB14中,因为偏移为0,所以对应于DB14.DBW0;轮循命令时功能码为4,读取一个或多个输入寄存器:--》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=4对应)等于4时,读取1#从站30001计1个输入寄存器,读取到的数据放入到DB13中,因为偏移为0,所以对应于DB13.DBW0;轮循命令时功能码为5,写一个线圈:-》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=5对应)等于5时,因为偏移为0,所以将DB10中DB10.DBX0.0的数据写至1#从站的线圈00001,SndFnCode为5时SndNum的值可为任意;轮循命令时功能码为6,写一个保持寄存器:-》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=6对应)等于6时,因为偏移为0,所以将DB14中DB14.DBW0中的数据写至1#从站保持寄存器40001,SndFnCode为6时SndNum的值可为任意;轮循命令时功能码为15,写一个或多个线圈:-》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=7对应)等于7时,因为偏移为0,所以将DB10中DB10.DBX0.0~DB10.DBX1.7计16个位的数据写至1#从站的线圈00001~00016;轮循命令时功能码为16,写一个或多个保持寄存器:-》当FB171的轮询值管脚PollVal(与FC190的管脚PollNO=8对应)等于8时,因为偏移为0,所以将DB14中DB14.DBW0计1个字的数据写至1#从站保持寄存器40001;5、示例程序中8条FC190随机操作命令的解释:(高级应用)随机操作时功能码为1,读取一个或多个线圈状态:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.0(与FC190的管脚WrtNO=1对应)的值置1时,立刻从轮循模式切换至随机操作模式,发出命令读取254#从站065281~065305计24个线圈状态,并自动将DB171.DBX622.0的值复位为0,读取到的数据放入到DB20中,因为偏移为0,所以对应于DB20.DBX0.0~DB20.DBX2.7,读取完毕恢复至轮循模式;随机操作时功能码为2,读取一个或多个输入状态:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.1(与FC190的管脚WrtNO=2对应)的值置1时,立刻从轮循模式切换至随机操作模式,发出命令读取254#从站165281~165305计24个输入状态,并自动将DB171.DBX622.1的值复位为0,读取到的数据放入到DB21中,因为偏移为0,所以对应于DB21.DBX0.0~DB21.DBX2.7,读取完毕恢复至轮循模式;随机操作时功能码为3,读取一个或多个保持寄存器:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.2(与FC190的管脚WrtNO=3对应)的值置1时,立刻从轮循模式切换至随机操作模式,发出命令读取254#从站465281计1个保持寄存器,并自动将DB171.DBX622.2的值复位为0,读取到的数据放入到DB24中,因为偏移为0,所以对应于DB24.DBW0,读取完毕恢复至轮循模式;随机操作时功能码为4,读取一个或多个输入寄存器:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.3(与FC190的管脚WrtNO=4对应)的值置1时,立刻从轮循模式切换至随机操作模式,发出命令读取254#从站365281计1个输入寄存器,并自动将DB171.DBX622.3的值复位为0,读取到的数据放入到DB23中,因为偏移为0,所以对应于DB23.DBW0,读取完毕恢复至轮循模式;随机操作时功能码为5,写一个线圈:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.4(与FC190的管脚WrtNO=5对应)的值置1时,立刻从轮循模式切换至随机操作模式,因为偏移为0,所以发出命令将DB20中DB20.DBX0.0的数据写至254#从站的线圈065281,并自动将DB171.DBX622.4的值复位为0,操作完毕恢复至轮循模式,SndFnCode为5时SndNum的值可为任意;随机操作时功能码为6,写一个保持寄存器:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.5(与FC190的管脚WrtNO=6对应)的值置1时,立刻从轮循模式切换至随机操作模式,因为偏移为0,所以发出命令将DB24中DB24.DBW0中的数据写至254#从站保持寄存器465281,并自动将DB171.DBX622.5的值复位为0,操作完毕恢复至轮循模式,SndFnCode为6时SndNum的值可为任意;随机操作时功能码为15,写一个或多个线圈:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.6(与FC190的管脚WrtNO=7对应)的值置1时,立刻从轮循模式切换至随机操作模式,因为偏移为0,所以发出命令将DB20中DB20.DBX0.0~DB20.DBX1.7计16个位的数据写至254#从站的线圈065281~065297,并自动将DB171.DBX622.6的值复位为0,操作完毕恢复至轮循模式;随机操作时功能码为16,写一个或多个保持寄存器:--》当(某一条件)将FB171的背景数据块中DB171.DBX622.7(与FC190的管脚WrtNO=8对应)