wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10402|回復: 9
打印 上一主題 下一主題
收起左側

觸摸屏和單片機進行modbus通訊 RTU slave 文件源碼,希望可以幫助到大家

  [復制鏈接]
跳轉到指定樓層
樓主
觸摸屏和單片機進行modbus通訊,觸摸屏需要設置為主機,單片機為從機,modbusRTU slave 源碼需要植入單片機,希望可以幫助到大家。


全部資料下載:
ModbusSlave.zip (13.59 KB, 下載次數: 249)

  1. /****************************************Copyright (c)**************************************************
  2. **                                  廣州致遠電子有限公司
  3. **
  4. **--------------File Info-------------------------------------------------------------------------------
  5. ** File name:                        MB_PFunction.c
  6. ** Last modified Date:  2005-01-11
  7. ** Last Version:                1.0
  8. ** Descriptions:               
  9. **
  10. **------------------------------------------------------------------------------------------------------
  11. ** Created by:                        ZhouLishan
  12. ** Created date:                2005-01-11
  13. ** Version:                                1.0
  14. ** Descriptions:               
  15. **
  16. **------------------------------------------------------------------------------------------------------
  17. ** Modified by:
  18. ** Modified date:
  19. ** Version:
  20. ** Descriptions:
  21. **
  22. ********************************************************************************************************/
  23. #include        "config.h"

  24. #include        "modbus.h"



  25. //**************************************************
  26. // 函數名稱:MB_GetDiscrete
  27. // 輸入參數:Address,線圈地址
  28. // 輸出參數:返回線圈值(0\1)
  29. // 功能描述:獲取離散值函數,訪函數由用戶編寫
  30. //**************************************************
  31. uint8_t MB_GetDiscrete(uint16_t Address)
  32. {
  33.         if(Address/2)
  34.                 return 1;
  35.         else
  36.                 return 0;
  37. }

  38. //**************************************************
  39. // 函數名稱:MB_GetCoils
  40. // 輸入參數:Address,線圈地址
  41. // 輸出參數:返回線圈值(0\1)
  42. // 功能描述:獲取線圈值函數,訪函數由用戶編寫
  43. //**************************************************
  44. uint8_t MB_GetCoils(uint16_t Address)
  45. {
  46.         if(Address/2)
  47.                 return 1;
  48.         else
  49.                 return 0;
  50. }

  51. //**************************************************
  52. // 函數名稱:MB_SetCoil
  53. // 輸入參數:Address,線圈地址
  54. //                         CoilValue,線圈值(0\1)
  55. // 輸出參數:返回寄存器值
  56. // 功能描述:設置線圈值函數,訪函數由用戶編寫
  57. //**************************************************
  58. uint8_t MB_SetCoil(uint16_t Address,uint8_t CoilValue)
  59. {

  60.         return CoilValue;
  61. }


  62. //**************************************************
  63. // 函數名稱:MB_GetInputRegValue
  64. // 輸入參數:Address,寄存器地址
  65. // 輸出參數:返回寄存器值
  66. // 功能描述:讀輸入寄存器值函數,訪函數由用戶編寫
  67. //**************************************************
  68. uint16_t MB_GetInputRegValue(uint16_t Address)
  69. {

  70.         return Address;
  71. }

  72. //**************************************************
  73. // 函數名稱:MB_GetRegValue
  74. // 輸入參數:Address,寄存器地址
  75. // 輸出參數:返回寄存器值
  76. // 功能描述:讀保持寄存器值函數,訪函數由用戶編寫
  77. //**************************************************
  78. uint16_t MB_GetRegValue(uint16_t Address)
  79. {

  80.         return Address;
  81. }

  82. //**************************************************
  83. // 函數名稱:MB_SetRegValue
  84. // 輸入參數:Address,寄存器地址
  85. //                         Value,寫入的值
  86. // 輸出參數:無
  87. // 功能描述:寫保持寄存器值函數,訪函數由用戶編寫
  88. //**************************************************
  89. void MB_SetRegValue(uint16_t Address,uint16_t Value)
  90. {

  91. }

  92. /****************************************************************************************/
  93. // 函數名稱:FReadCoils
  94. // 輸入參數:Response
  95. // 輸出參數:無
  96. // 功能描述:處理讀單線圈指令01
  97. /***************************************************************************************/
  98. void FReadCoils(PDU_RESPONSE *Response);
  99. /****************************************************************************************/
  100. // 函數名稱:FReadDiscreteInputs
  101. // 輸入參數:Response
  102. // 輸出參數:無
  103. // 功能描述:處理讀離散輸入指令02
  104. /***************************************************************************************/
  105. void FReadDiscreteInputs(PDU_RESPONSE *Response);
  106. /****************************************************************************************/
  107. // 函數名稱:FReadHoldingReg
  108. // 輸入參數:Response
  109. // 輸出參數:無
  110. // 功能描述:處理讀保持寄存器指令03
  111. /****************************************************************************************/
  112. void FReadHoldingReg(PDU_RESPONSE *Response);
  113. /****************************************************************************************/
  114. // 函數名稱:FReadInputReg
  115. // 輸入參數:Response
  116. // 輸出參數:無
  117. // 功能描述:處理讀輸入寄存器指令04
  118. /****************************************************************************************/
  119. void FReadInputReg(PDU_RESPONSE *Response);
  120. /****************************************************************************************/
  121. // 函數名稱:FWriteSingleCoil
  122. // 輸入參數:Response
  123. // 輸出參數:無
  124. // 功能描述:處理寫單線圈指令05
  125. /****************************************************************************************/
  126. void FWriteSingleCoil(PDU_RESPONSE *Response);
  127. /****************************************************************************************/
  128. // 函數名稱:FWriteSingleReg
  129. // 輸入參數:Response
  130. // 輸出參數:無
  131. // 功能描述:處理寫單線圈指令06
  132. /****************************************************************************************/
  133. void FWriteSingleReg(PDU_RESPONSE *Response);
  134. /****************************************************************************************/
  135. // 函數名稱:FWriteMultipleCoils
  136. // 輸入參數:Response
  137. // 輸出參數:無
  138. // 功能描述:處理寫多線圈指令15
  139. /****************************************************************************************/
  140. void FWriteMultipleCoils(PDU_RESPONSE *Response);
  141. /****************************************************************************************/
  142. // 函數名稱:FWriteMultipleReg
  143. // 輸入參數:Response
  144. // 輸出參數:無
  145. // 功能描述:處理寫多寄存器指令16
  146. /****************************************************************************************/
  147. void FWriteMultipleReg(PDU_RESPONSE *Response);
  148. /****************************************************************************************/
  149. // 函數名稱:FMaskWriteReg
  150. // 輸入參數:Response
  151. // 輸出參數:無
  152. // 功能描述:處理屏蔽寄存器指令22
  153. /****************************************************************************************/
  154. void FMaskWriteReg(PDU_RESPONSE *Response);
  155. /****************************************************************************************/
  156. // 函數名稱:FRWMultipleReg
  157. // 輸入參數:Response
  158. // 輸出參數:無
  159. // 功能描述:處理讀寫多寄存器指令23
  160. /****************************************************************************************/
  161. void FRWMultipleReg(PDU_RESPONSE *Response);

  162. void FTest(PDU_RESPONSE *Response){}

  163. AT_CODE FUNCTION_ARRAY        FCodeHandleArray[MAX_FUNCTION]={
  164. #if READ_COILS_EN > 0
  165.         {0x01,FReadCoils},                        // 讀線圈
  166. #endif
  167. #if READ_DIS_INPUT_EN > 0
  168.         {0x02,FReadDiscreteInputs},        // 讀離散量輸入
  169. #endif
  170. #if READ_HOLD_REG_EN > 0
  171.         {0x03,FReadHoldingReg},                // 讀保持寄存器
  172. #endif
  173. #if READ_INPUT_REG_EN > 0
  174.         {0x04,FReadInputReg},                // 讀輸入寄存器
  175. #endif
  176. #if WRITE_SING_COIL_EN > 0
  177.         {0x05,FWriteSingleCoil},        // 寫單個線圈
  178. #endif
  179. #if WRITE_SING_REG_EN > 0
  180.         {0x06,FWriteSingleReg},                // 寫單個寄存器
  181. #endif
  182. #if WRITE_MULT_COIL_EN > 0
  183.         {0x0f,FWriteMultipleCoils},        // 寫多個線圈
  184. #endif
  185. #if WRITE_MULT_REG_EN > 0
  186.         {0x10,FWriteMultipleReg},        // 寫多個寄存器
  187. #endif
  188. #if MASK_WRITE_REG_EN > 0
  189.         {0x16,FMaskWriteReg},                // 處理屏蔽寄存器指令
  190. #endif
  191. #if READ_WRITE_REG_EN > 0
  192.         {0x17,FRWMultipleReg},                // 讀寫多個寄存器
  193. #endif
  194.         {0x00,FTest}                                // 測試功能代碼
  195. };

  196. #if READ_DIS_INPUT_EN
  197. //************************************************************************************
  198. // 函數名稱:ReadDiscreteInputs
  199. // 輸入參數:CoilsDataPtr,存放離散輸入數據指針
  200. //                         StAddr,離散的起始地址
  201. //                         Quantity,離散的數量
  202. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  203. // 功能描述:讀離散輸入操作函數
  204. //************************************************************************************        
  205. uint8_t ReadDiscreteInputs(uint8_t *CoilsDataPtr,uint16_t StAddr ,uint16_t Quantity)
  206. {
  207.         uint8_t *CoilsInByte;
  208.         uint8_t offset;
  209.         uint16_t i=0 ;
  210.         CoilsInByte = CoilsDataPtr;
  211.         while(i<Quantity)
  212.         {        
  213.                 *CoilsInByte = 0;
  214.                 for(offset=0;offset<8;offset++,i++)                // 將線圈值寫入一個字節
  215.                 {
  216.                         if(i<Quantity)
  217.                         {
  218.                                 *CoilsInByte |= MB_GetDiscrete(StAddr+i)<<offset;
  219.                         }
  220.                 }
  221.                 CoilsInByte++;
  222.         }
  223.         return TRUE;
  224. }
  225. #endif


  226. #if READ_COILS_EN
  227. //************************************************************************************
  228. // 函數名稱:ReadCoils
  229. // 輸入參數:CoilsDataPtr,存放線圈數據指針
  230. //                         StAddr,線圈的起始地址
  231. //                         Quantity,線圈的數量
  232. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  233. // 功能描述:讀多線圈操作函數
  234. //************************************************************************************        
  235. uint8_t ReadCoils(uint8_t *CoilsDataPtr,uint16_t StAddr ,uint16_t Quantity)
  236. {
  237.         uint8_t *CoilsInByte;
  238.         uint8_t offset;
  239.         uint16_t i=0 ;
  240.         CoilsInByte = CoilsDataPtr;
  241.         while(i<Quantity)
  242.         {        
  243.                 *CoilsInByte = 0;
  244.                 for(offset=0;offset<8;offset++,i++)                // 將線圈值寫入一個字節
  245.                 {
  246.                         if(i<Quantity)
  247.                         {
  248.                                 *CoilsInByte |= MB_GetCoils(StAddr+i)<<offset;
  249.                         }
  250.                 }
  251.                 CoilsInByte++;
  252.         }
  253.         return TRUE;
  254. }
  255. #endif

  256. #if WRITE_SING_COIL_EN
  257. //************************************************************************************
  258. // 函數名稱:WriteSingleCoil
  259. // 輸入參數:DataPtr,數據指針,
  260. //                         StAddr,寄存器起始地址
  261. //                         Quantity,寄存器數量。
  262. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  263. // 功能描述:寫單線圈處理函數
  264. //************************************************************************************        
  265. uint8_t WriteSingleCoil(uint16_t OutputAddr,uint16_t OutputValue)
  266. {
  267.         return MB_SetCoil(OutputAddr,(OutputValue==0xff00)?1:0);
  268. }
  269. #endif

  270. #if WRITE_MULT_COIL_EN
  271. //************************************************************************************
  272. // 函數名稱:WriteMultipleCoils
  273. // 輸入參數:DataPtr,數據指針,
  274. //                         StAddr,寄存器起始地址
  275. //                         Quantity,寄存器數量。
  276. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  277. // 功能描述:寫多線圈處理函數
  278. //************************************************************************************        
  279. uint8 WriteMultipleCoils(uint8 *DataPtr,uint16 StAddr ,uint16 Quantity)
  280. {
  281.         uint16 i;
  282.         uint8         CoilInByte;
  283.         for(i=0;i<Quantity;i++)
  284.         {
  285.                 if((i%8)==0)        
  286.                         CoilInByte = *(DataPtr+(i/8));
  287.                 if( FALSE == MB_SetCoil(StAddr+i,(CoilInByte>>(i%8))&0x01))
  288.                         return FALSE;        
  289.         }
  290.         return TRUE;
  291. }
  292. #endif

  293. #if READ_INPUT_REG_EN
  294. //************************************************************************************
  295. // 函數名稱:ReadInputReg
  296. // 輸入參數:DataPtr,數據指針,
  297. //                         StAddr,寄存器起始地址
  298. //                         Quantity,寄存器數量。
  299. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  300. // 功能描述:讀輸入寄存器
  301. //************************************************************************************        
  302. uint8_t ReadInputReg(uint8_t *DataPtr,uint16_t StAddr ,uint16_t Quantity)
  303. {
  304.         uint8_t i;
  305.         uint16_t        Value;
  306.         for(i=0;i<Quantity;i++)
  307.         {
  308.                 Value = MB_GetInputRegValue(StAddr+i);
  309.                 *(DataPtr+i*2)   = (uint8)(Value>>8);                 // 先傳高位
  310.                 *(DataPtr+i*2+1) = (uint8)Value;                          // 后傳低位
  311.         }
  312.         return TRUE;
  313. }
  314. #endif


  315. #if READ_HOLD_REG_EN+READ_WRITE_REG_EN+MASK_WRITE_REG_EN
  316. //************************************************************************************
  317. // 函數名稱:ReadHoldingReg
  318. // 輸入參數:DataPtr,數據指針,16位數據高8位在低字節,低8位在高字節
  319. //                         StAddr,寄存器起始地址
  320. //                         Quantity,寄存器數量。
  321. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  322. // 功能描述:讀寄存器處理函數
  323. //************************************************************************************        
  324. uint8_t ReadHoldingReg(uint8_t *DataPtr,uint16_t StAddr ,uint16_t Quantity)
  325. {
  326.         uint8_t i;
  327.         uint16_t        Value;
  328.         for(i=0;i<Quantity;i++)
  329.         {
  330.                 Value = MB_GetRegValue(StAddr+i);
  331.                 *(DataPtr+i*2)   = (uint8)(Value>>8);         // 先傳高位
  332.                 *(DataPtr+i*2+1) = (uint8)Value;                  // 后傳低位
  333.         }
  334.         return TRUE;
  335. }
  336. #endif

  337. #if WRITE_MULT_REG_EN+READ_WRITE_REG_EN+MASK_WRITE_REG_EN+WRITE_SING_REG_EN
  338. //************************************************************************************
  339. // 函數名稱:WriteHoldingReg
  340. // 輸入參數:DataPtr,數據指針,16位數據高8位在低字節,低8位在高字節
  341. //                         StAddr,寄存器起始地址
  342. //                         Quantity,寄存器數量。
  343. // 輸出參數:正常返回TRUE,出錯返回FALSE。
  344. // 功能描述:寫寄存器處理函數
  345. //************************************************************************************        
  346. uint8_t WriteHoldingReg(uint8_t *KeepDataPtr,uint16_t StAddr ,uint16_t Quantity)
  347. {
  348.         uint8_t i;
  349.         uint16_t        Value;
  350.         for(i=0;i<Quantity;i++)
  351.         {
  352.                 Value = (*(KeepDataPtr+i*2)<<8)|(*(KeepDataPtr+i*2+1));
  353.                 MB_SetRegValue(StAddr+i,Value);
  354.         }
  355.         return TRUE;
  356. }
  357. #endif










  358. #if READ_COILS_EN > 0
  359. /****************************************************************************************/
  360. // 函數名稱:FReadCoils
  361. // 輸入參數:Response,為PDU_RESPONSE類型的指針,PDU_RESPONSE:
  362. //                         typedef struct __PDU_RESPONSE{
  363. //                                uint8*        PDUDataPtr;   請求數據指針,功能代碼處理函數必需將處理的數據包存在該指針的開始位始
  364. //                                  uint8        PDUByteLength;請求數據數長度
  365. //                                uint8        ExceptionCode;僅為輸出錯異常代碼,正常操作設為0
  366. //                         }PDU_RESPONSE
  367. // 輸出參數:無
  368. // 功能描述:處理讀多線圈指令01
  369. /***************************************************************************************/
  370. void FReadCoils(PDU_RESPONSE *Response)
  371. {
  372.         uint8_t * PDUPtr;
  373.         uint16_t StAddr ,Quantity;
  374.         // 從請求PDU中提取相關參數
  375.         PDUPtr = Response->PDUDataPtr;
  376.         StAddr = PDUPtr[1]<<8|PDUPtr[2];
  377.         Quantity =  PDUPtr[3]<<8|PDUPtr[4];
  378.         
  379.         Response->PDUByteLength = 2 + Quantity/8+((Quantity%8)?1:0) ;        // 正常返回的數據長度
  380.         
  381.         if((Quantity>=0x001)&&(Quantity<=0x07d0))
  382.         {
  383.                 if((StAddr<END_COILS_ADDR)&&((StAddr+Quantity)<=END_COILS_ADDR))
  384.                 {                        
  385.                         if(ReadCoils(PDUPtr+2,StAddr,Quantity))
  386.                         {
  387.                                 *(PDUPtr+1) = Quantity/8+(Quantity%8)?1:0;        // 字節數
  388.                                 Response->ExceptionCode = 0x00;
  389.                         }
  390.                         else
  391.                                 Response->ExceptionCode = 0x04;
  392.                 }
  393.                 else
  394.                         Response->ExceptionCode = 0x02;
  395.         }
  396.         else
  397.                 Response->ExceptionCode = 0x03;
  398. }
  399. #endif

  400. #if READ_DIS_INPUT_EN >0
  401. /****************************************************************************************/
  402. // 函數名稱:FReadDiscreteInputs
  403. // 輸入參數:Response
  404. // 輸出參數:無
  405. // 功能描述:處理讀離散輸入指令02
  406. /***************************************************************************************/
  407. void FReadDiscreteInputs(PDU_RESPONSE *Response)
  408. {
  409.         uint8_t * PDUPtr;
  410.         uint16_t StAddr ,Quantity;
  411.         // 從請求PDU中提取相關參數
  412.         PDUPtr = Response->PDUDataPtr;
  413.         StAddr = PDUPtr[1]<<8|PDUPtr[2];
  414.         Quantity =  PDUPtr[3]<<8|PDUPtr[4];
  415.         
  416.         Response->PDUByteLength = 2 + Quantity/8+((Quantity%8)?1:0) ;        // 正常返回的數據長度
  417.         
  418.         if((Quantity>=0x001)&&(Quantity<=0x07d0))
  419.         {
  420.                 if((StAddr<END_DISC_INPUT_ADDR)&&((StAddr+Quantity)<=END_DISC_INPUT_ADDR))
  421.                 {                        
  422.                         if(ReadDiscreteInputs(PDUPtr+2,StAddr,Quantity))
  423.                         {
  424.                                 *(PDUPtr+1) = Quantity/8+(Quantity%8)?1:0;        // 字節數
  425.                                 Response->ExceptionCode = 0x00;
  426.                         }
  427.                         else
  428.                                 Response->ExceptionCode = 0x04;
  429.                 }
  430.                 else
  431.                         Response->ExceptionCode = 0x02;
  432.         }
  433.         else
  434.                 Response->ExceptionCode = 0x03;
  435. }
  436. #endif

  437. #if READ_HOLD_REG_EN >0
  438. /****************************************************************************************/
  439. // 函數名稱:FReadHoldingReg
  440. // 輸入參數:Response
  441. // 輸出參數:無
  442. // 功能描述:處理讀保持寄存器指令03
  443. /****************************************************************************************/
  444. void FReadHoldingReg(PDU_RESPONSE *Response)
  445. {
  446.         uint8_t * PDUPtr;
  447.         uint16_t StAddr ,Quantity;
  448.         // 從請求PDU中提取相關參數
  449.         PDUPtr = Response->PDUDataPtr;
  450.         StAddr = PDUPtr[1]<<8|PDUPtr[2];
  451.         Quantity =  PDUPtr[3]<<8|PDUPtr[4];
  452.         
  453.         Response->PDUByteLength = 2 + Quantity*2 ;        // 正常返回的數據長度
  454.         
  455.         if((Quantity>=0x001)&&(Quantity<=0x007d))
  456.         {
  457.                 if((StAddr<END_HOLDING_REG_ADDR)&&((StAddr+Quantity)<=END_HOLDING_REG_ADDR))
  458.                 {                        
  459.                         if(ReadHoldingReg(PDUPtr+2,StAddr,Quantity))
  460.                         {
  461.                                 *(PDUPtr+1) = Quantity*2;
  462.                                 Response->ExceptionCode = 0x00;
  463.                         }
  464.                         else
  465.                                 Response->ExceptionCode = 0x04;
  466.                 }
  467.                 else
  468.                         Response->ExceptionCode = 0x02;
  469.         }
  470.         else
  471.                 Response->ExceptionCode = 0x03;
  472. }
  473. #endif

  474. #if READ_INPUT_REG_EN >0
  475. /****************************************************************************************/
  476. // 函數名稱:FReadInputReg
  477. // 輸入參數:Response
  478. // 輸出參數:無
  479. // 功能描述:處理讀輸入寄存器指令04
  480. /****************************************************************************************/
  481. void FReadInputReg(PDU_RESPONSE *Response)
  482. {
  483.         uint8_t * PDUPtr;
  484.         uint16_t StAddr ,Quantity;
  485.         // 從請求PDU中提取相關參數
  486.         PDUPtr = Response->PDUDataPtr;
  487.         StAddr = PDUPtr[1]<<8|PDUPtr[2];
  488.         Quantity =  PDUPtr[3]<<8|PDUPtr[4];
  489.         
  490.         Response->PDUByteLength = 2 + Quantity*2 ;        // 正常返回的數據長度
  491.         
  492.         if((Quantity>=0x001)&&(Quantity<=0x007d))
  493.         {
  494.                 if((StAddr<END_INPUT_REG_ADDR) && ((StAddr+Quantity)<=END_INPUT_REG_ADDR))
  495.                 {                        
  496.                         if(ReadInputReg(PDUPtr+2,StAddr,Quantity))
  497.                         {
  498.                                 *(PDUPtr+1) = Quantity*2;
  499.                                 Response->ExceptionCode = 0x00;
  500.                         }
  501.                         else
  502.                                 Response->ExceptionCode = 0x04;
  503.                 }
  504.                 else
  505.                         Response->ExceptionCode = 0x02;
  506.         }
  507.         else
  508.                 Response->ExceptionCode = 0x03;
  509. }
  510. #endif


  511. #if WRITE_SING_COIL_EN >0
  512. /****************************************************************************************/
  513. // 函數名稱:FWriteSingleCoil
  514. // 輸入參數:Response
  515. // 輸出參數:無
  516. // 功能描述:處理寫單線圈指令05
  517. /****************************************************************************************/
  518. void FWriteSingleCoil(PDU_RESPONSE *Response)
  519. {
  520.         uint8_t * PDUPtr;
  521.         uint16_t OutputAddr ,OutputValue;
  522.         // 從請求PDU中提取相關參數
  523.         PDUPtr = Response->PDUDataPtr;
  524.         OutputAddr = PDUPtr[1]<<8|PDUPtr[2];
  525.         OutputValue =  PDUPtr[3]<<8|PDUPtr[4];
  526.         
  527.         Response->PDUByteLength = 5 ;        // 正常返回的數據長度
  528.         
  529.         if((OutputValue==0x0000)||(OutputValue==0xff00))
  530.         {
  531.                 if( OutputAddr < END_COILS_ADDR )
  532.                 {                        
  533.                         if(WriteSingleCoil(OutputAddr,OutputValue))
  534.                         {
  535.                                 *(PDUPtr+1) = OutputAddr>>8;
  536.                                 *(PDUPtr+2) = OutputAddr;
  537.                                 *(PDUPtr+3)        = OutputValue>>8;
  538.                                 *(PDUPtr+4)        = OutputValue;
  539.                                 Response->ExceptionCode = 0x00;
  540.                         }
  541.                         else
  542.                                 Response->ExceptionCode = 0x04;
  543.                 }
  544.                 else
  545.                         Response->ExceptionCode = 0x02;
  546.         }
  547.         else
  548.                 Response->ExceptionCode = 0x03;
  549. }
  550. #endif

  551. #if WRITE_SING_REG_EN >0
  552. /****************************************************************************************/
  553. // 函數名稱:FWriteSingleReg
  554. // 輸入參數:Response
  555. // 輸出參數:無
  556. // 功能描述:處理寫單線圈指令06
  557. /****************************************************************************************/
  558. void FWriteSingleReg(PDU_RESPONSE *Response)
  559. {
  560.         uint8 * PDUPtr;
  561.         uint16 OutputAddr ,OutputValue;
  562.         // 從請求PDU中提取相關參數
  563.         PDUPtr = Response->PDUDataPtr;
  564.         OutputAddr = PDUPtr[1]<<8|PDUPtr[2];
  565.         OutputValue =  PDUPtr[3]<<8|PDUPtr[4];
  566.         
  567.         Response->PDUByteLength = 2 + 5 ;        // 正常返回的數據長度
  568.         
  569.         if(OutputValue<=0xffff)
  570.         {
  571.                 if(OutputAddr<END_HOLDING_REG_ADDR)
  572.                 {                        
  573.                         if(WriteHoldingReg(&PDUPtr[3],OutputAddr,1))
  574.                         {
  575.                                 *(PDUPtr+1) = OutputAddr>>8;
  576.                                 *(PDUPtr+2) = OutputAddr;
  577.                                 *(PDUPtr+3)        = OutputValue>>8;
  578.                                 *(PDUPtr+4)        = OutputValue;
  579.                                 Response->ExceptionCode = 0x00;
  580.                         }
  581.                         else
  582.                                 Response->ExceptionCode = 0x04;
  583.                 }
  584.                 else
  585.                         Response->ExceptionCode = 0x02;
  586.         }
  587.         else
  588.                 Response->ExceptionCode = 0x03;
  589. }
  590. #endif

  591. #if WRITE_MULT_COIL_EN >0
  592. /****************************************************************************************/
  593. // 函數名稱:FWriteMultipleCoils
  594. // 輸入參數:Response
  595. // 輸出參數:無
  596. // 功能描述:處理寫多線圈指令15
  597. /****************************************************************************************/
  598. void FWriteMultipleCoils(PDU_RESPONSE *Response)
  599. {
  600.         uint8_t * PDUPtr;
  601.         uint16_t StAddr ,Quantity;
  602.         uint8_t         ByteCount;
  603.         // 從請求PDU中提取相關參數
  604.         PDUPtr = Response->PDUDataPtr;
  605.         StAddr = PDUPtr[1]<<8|PDUPtr[2];
  606.         Quantity =  PDUPtr[3]<<8|PDUPtr[4];
  607.         ByteCount = PDUPtr[5];
  608.         
  609.         Response->PDUByteLength = 5 ;        // 正常返回的數據長度

  610.         if((Quantity>=0x001)&&(Quantity<=0x07d0)&&(ByteCount==(Quantity/8+((Quantity%8)?1:0))))
  611.         {
  612.                 if((StAddr<END_COILS_ADDR)&&((StAddr+Quantity)<=(END_COILS_ADDR+1)))
  613.                 {                        
  614.                         if(WriteMultipleCoils(PDUPtr+6,StAddr,Quantity))
  615.                         {
  616.                                 *(PDUPtr+1) = StAddr>>8;
  617.                                 *(PDUPtr+2) = StAddr;
  618.                                 *(PDUPtr+3) = Quantity>>8;
  619.                                 *(PDUPtr+4) = Quantity;
  620.                                 Response->ExceptionCode = 0x00;
  621.                         }
  622.                         else
  623.                                 Response->ExceptionCode = 0x04;
  624.                 }
  625.                 else
  626.                         Response->ExceptionCode = 0x02;
  627.         }
  628.         else
  629.                 Response->ExceptionCode = 0x03;
  630. }
  631. #endif

  632. #if WRITE_MULT_REG_EN >0
  633. /****************************************************************************************/
  634. // 函數名稱:FWriteMultipleReg
  635. // 輸入參數:Response
  636. // 輸出參數:無
  637. // 功能描述:處理寫多寄存器指令16
  638. /****************************************************************************************/
  639. void FWriteMultipleReg(PDU_RESPONSE *Response)
  640. {
  641.         uint8_t * PDUPtr;
  642.         uint16_t StAddr ,Quantity;
  643.         uint8_t         ByteCount;
  644.         // 從請求PDU中提取相關參數
  645.         PDUPtr = Response->PDUDataPtr;
  646.         StAddr = PDUPtr[1]<<8|PDUPtr[2];
  647.         Quantity =  PDUPtr[3]<<8|PDUPtr[4];
  648.         ByteCount = PDUPtr[5];
  649.         
  650.         Response->PDUByteLength = 5 ;        // 正常返回的數據長度

  651.         if((Quantity>=0x001)&&(Quantity<=0x007d)&&(ByteCount==(Quantity*2)))
  652.         {
  653.                 if((StAddr<END_HOLDING_REG_ADDR) && ((StAddr+Quantity)<=(END_HOLDING_REG_ADDR+1)))
  654.                 {                        
  655.                         if(WriteHoldingReg(PDUPtr+6,StAddr,Quantity))
  656.                         {
  657.                                 *(PDUPtr+1) = StAddr>>8;
  658.                                 *(PDUPtr+2) = StAddr;
  659.                                 *(PDUPtr+3) = Quantity>>8;
  660.                                 *(PDUPtr+4) = Quantity;
  661.                                 Response->ExceptionCode = 0x00;
  662.                         }
  663.                         else
  664.                                 Response->ExceptionCode = 0x04;
  665.                 }
  666.                 else
  667.                         Response->ExceptionCode = 0x02;
  668.         }
  669.         else
  670.                 Response->ExceptionCode = 0x03;
  671. }
  672. #endif

  673. #if MASK_WRITE_REG_EN >0
  674. /****************************************************************************************/
  675. // 函數名稱:FMaskWriteReg
  676. // 輸入參數:Response
  677. // 輸出參數:無
  678. // 功能描述:處理屏蔽寄存器指令22
  679. /****************************************************************************************/
  680. void FMaskWriteReg(PDU_RESPONSE *Response)
  681. {
  682.         uint16_t RefeAddr,And_Mask,Or_Mask,RegValue;
  683.         uint8_t  *PDUPtr;
  684.         uint8_t  ValueInByte[2];               
  685.         PDUPtr = Response->PDUDataPtr;
  686.         RefeAddr = (PDUPtr[1]<<8)|(PDUPtr[2]);
  687.         And_Mask = (PDUPtr[3]<<8)|(PDUPtr[4]);
  688.         Or_Mask  = (PDUPtr[5]<<8)|(PDUPtr[6]);
  689.         
  690.         Response->PDUByteLength = 7;
  691.         
  692.         if(RefeAddr<END_HOLDING_REG_ADDR)
  693.         {
  694.                 if(ReadHoldingReg(ValueInByte,RefeAddr,1))
  695.                 {        
  696.                         RegValue = (ValueInByte[0]<<8)|(ValueInByte[1]);
  697.                         RegValue = (RegValue & And_Mask)|(Or_Mask & (~And_Mask));
  698.                         ValueInByte[0] = RegValue >> 8;
  699.                         ValueInByte[1] = RegValue ;
  700.                         if(WriteHoldingReg(ValueInByte,RefeAddr,1))
  701.                         {
  702.                                 *(PDUPtr+1) = RefeAddr>>8;
  703.                                 *(PDUPtr+2) = RefeAddr;
  704.                                 *(PDUPtr+3) = And_Mask>>8;
  705.                                 *(PDUPtr+4) = And_Mask;
  706.                                 *(PDUPtr+5) = Or_Mask>>8;
  707.                                 *(PDUPtr+6) = Or_Mask;
  708.                                 Response->ExceptionCode = 0x00;
  709.                         }
  710.                         else
  711.                                 Response->ExceptionCode = 0x04;
  712.                 }
  713.                 else
  714.                         Response->ExceptionCode = 0x03;
  715.         }
  716.         else
  717.                 Response->ExceptionCode = 0x02;
  718. }
  719. #endif

  720. #if READ_WRITE_REG_EN > 0
  721. /****************************************************************************************/
  722. // 函數名稱:FRWMultipleReg
  723. // 輸入參數:Response
  724. // 輸出參數:無
  725. // 功能描述:處理讀寫多寄存器指令23
  726. /****************************************************************************************/
  727. void FRWMultipleReg(PDU_RESPONSE *Response)
  728. {
  729.         uint16_t ReadStaAddr,        ReadQuantity;
  730.         uint16_t WriteStaAddr,WriteQuantity;
  731.         uint8_t  WriteBytes;
  732.         uint8_t  *WriteValuePtr;
  733.         uint8_t  *PDUPtr;
  734.         PDUPtr = Response->PDUDataPtr;
  735.         ReadStaAddr   = (PDUPtr[1]<<8)|(PDUPtr[2]);
  736.         ReadQuantity  = (PDUPtr[3]<<8)|(PDUPtr[4]);
  737.         WriteStaAddr  = (PDUPtr[5]<<8)|(PDUPtr[6]);
  738.         WriteQuantity = (PDUPtr[7]<<8)|(PDUPtr[8]);
  739.         WriteBytes    = PDUPtr[9];
  740.         WriteValuePtr = &PDUPtr[10];

  741.         Response->PDUByteLength = ReadQuantity*2 + 2;
  742.         
  743.         if((ReadQuantity>=0x001)&&(ReadQuantity<=0x007d)&&                // 讀寄存器的數量是否在有效范圍內
  744.            (WriteQuantity>=0x001)&&(WriteQuantity<=0x0079)&&        // 寫寄存器的數量是否在有效范圍內
  745.            (WriteBytes==(WriteQuantity*2)))                                                // 接收到的字節數是否與寫入的寄存器數量一至
  746.         {
  747.                 if((ReadStaAddr<END_HOLDING_REG_ADDR)&&((ReadStaAddr+ReadQuantity)<=END_HOLDING_REG_ADDR)&&
  748.                    (WriteStaAddr<END_HOLDING_REG_ADDR)&&((WriteStaAddr+WriteQuantity)<=END_HOLDING_REG_ADDR))
  749.                 {
  750.                         if(WriteHoldingReg(WriteValuePtr,WriteStaAddr,WriteQuantity))        // 寫寄存器
  751.                         {
  752.                            if(ReadHoldingReg(PDUPtr+2,ReadStaAddr,ReadQuantity))                // 讀寄存器
  753.                                 {
  754.                                         *(PDUPtr+1) = ReadQuantity*2;
  755.                                         Response->ExceptionCode = 0x00;
  756.                                 }
  757.                                 else
  758.                                         Response->ExceptionCode = 0x04;
  759.                         }
  760.                         else
  761.                                 Response->ExceptionCode = 0x04;
  762.                 }
  763.                 else
  764.                         Response->ExceptionCode = 0x02;
  765.         }
  766.         else
  767.                 Response->ExceptionCode = 0x03;
  768. }
  769. #endif












復制代碼


評分

參與人數 2黑幣 +55 收起 理由
zhangli019 + 5 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:151192 發表于 2016-11-30 13:11 | 只看該作者
你好,我想將單片機讀取的 一個溫度值通過modbus協議 傳輸到上位機  我的設計思路應該是怎樣的呢 能把我簡單的說明下嗎  謝謝你了!
回復

使用道具 舉報

無效樓層,該帖已經被刪除
地板
ID:156580 發表于 2017-1-10 10:18 | 只看該作者
這個資料很好,尤其是在工業控制應用方面,能制作成符合工業標準的控制器
回復

使用道具 舉報

5#
無效樓層,該帖已經被刪除
6#
ID:698773 發表于 2020-2-28 15:56 來自觸屏版 | 只看該作者
lisc5920 發表于 2016-11-30 13:11
你好,我想將單片機讀取的 一個溫度值通過modbus協議 傳輸到上位機  我的設計思路應該是怎樣的呢 能把我簡 ...

你的問題解決沒有?
回復

使用道具 舉報

7#
ID:698773 發表于 2020-2-28 16:00 來自觸屏版 | 只看該作者
這個有原理圖嘛?
回復

使用道具 舉報

8#
無效樓層,該帖已經被刪除
9#
ID:595103 發表于 2021-9-22 13:14 | 只看該作者
好資料,接下來的設計正好需要用到MODbus
回復

使用道具 舉報

10#
無效樓層,該帖已經被刪除
11#
ID:138205 發表于 2022-1-26 21:40 | 只看該作者
路過學習,好東西,收藏一下,
回復

使用道具 舉報

12#
無效樓層,該帖已經被刪除
13#
ID:1129695 發表于 2024-7-27 15:46 | 只看該作者

好資料,接下來的設計正好需要用到MODbus
回復

使用道具 舉報

14#
ID:811685 發表于 2024-8-2 19:43 | 只看該作者
路過學習,好東西,收藏一下,
回復

使用道具 舉報

15#
ID:884711 發表于 2024-10-8 08:52 | 只看該作者
好資料,正好用到MODbus,謝謝分享!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
免费在线观看av片| 国产精品流白浆视频| 91精品国产91久久久久久不卡| 99国精产品一二二线| 国模杨依粉嫩蝴蝶150p| 免费看的黄色录像| 欧美视频在线观看一区二区三区| 天天伊人狠狠| 僵尸再翻生在线观看| 婷婷激情综合| 国产亚洲精品bt天堂精选| re久久精品视频| 青草在线视频| 欧洲毛片在线视频免费观看| 岛国精品在线播放| 7777精品伊人久久久大香线蕉完整版| 18一19gay欧美视频网站| 欧美 另类 交| 超碰人人人人人人人| 成人影院久久久久久影院| 国产永久免费高清在线观看视频| 66精品视频在线观看| 六月丁香婷婷色狠狠久久| 欧美午夜女人视频在线| 久久久久久久久久av| 精品人妻大屁股白浆无码| 91香蕉视频污在线观看| 欧美性猛交99久久久久99| 老司机免费在线视频| 日韩精品首页| 国产精品久久久久久久裸模| 在线观看精品自拍私拍| 日韩精品资源| 欧美日韩国产一二三区| 久热精品免费视频| a级片免费在线观看| 亚洲视频免费| 色综合天天综合网天天看片| 浅井舞香一区二区| 久久综合久久色| 在线观看亚洲黄色| 午夜免费啪视频观看视频| 亚洲精品一二三**| 成人爱爱电影网址| 亚洲男子天堂网| 亚洲7777| 九九热国产精品视频| www.噜噜色.com| 亚洲国产91视频| 国产精品一区二区果冻传媒| 日韩一区二区三区在线观看| 国产一区二区三区高清视频| av永久免费观看| 国产成人夜间影院在线观看| 神马久久资源| 国产一区亚洲一区| 日韩av影院在线观看| 日韩中文字幕一区| 欧美人与禽zozzo禽性配| 九九热在线播放| 日韩精品三级| 欧美国产激情一区二区三区蜜月| 亚洲精品久久久久久国产精华液| 久久男人av资源网站| 精品久久久噜噜噜噜久久图片| 国产精品热久久| 在线观看二区| 亚洲永久免费精品| 欧美一区二区三区成人| 欧洲亚洲一区二区三区四区五区| 国产大片免费看| 国产va在线| 欧美日韩中文字幕一区二区三区| 亚洲激情欧美激情| 国产精品日韩在线观看| 久久久久亚洲AV成人无码国产| 久久精品国产免费观看99| 欧美va在线观看| 99久久婷婷国产精品综合| 中文字幕亚洲一区在线观看 | 视频区 图片区 小说区| 男女猛烈无遮挡午夜视频| 成人免费一区二区三区牛牛| 蜜桃av一区二区三区电影| 亚洲国产精品久久久久秋霞蜜臀| 2021国产视频| 97国产精品久久久| 欧美家庭影院| 国产激情精品久久久第一区二区 | 成人国产在线视频| xxxxx在线观看| 99热在线免费播放| japanese国产精品| 精品视频一区三区九区| 欧美高清视频一区二区三区在线观看| 久久久久久久久久久久久久免费看 | 神马久久午夜| 成人性视频网站| 久久久亚洲国产天美传媒修理工| 污污视频网站在线| 国产福利一区二区在线精品| 欧美激情精品| 一区二区三区四区激情| 91视频最新| 国产在线欧美在线| 国产福利在线视频| 久久国产视频网| 欧美成人第一页| 18禁一区二区三区| 18以下岁禁止1000部免费| 精品日本12videosex| 欧美三级视频在线播放| 日韩精品国内| 亚洲综合精品国产一区二区三区| 免费不卡av| 欧美一区二区三区激情视频| 欧美日韩一区二区在线观看| 久久久久久久久久久久久国产| 国产一区二区视频免费观看| 澳门成人av网| 国产精品美女www爽爽爽| 亚洲tv在线观看| 国产污污视频在线观看| 乱人伦中文视频在线| 久久久三级国产网站| 亚洲一区国产精品| 欧美在线视频精品| 99久久伊人| 欧美性xxxxxx| 国产不卡一区二区视频| 一个人看的www免费观看视频 | 国产亚洲高清视频| 久久成人人人人精品欧| av直播在线观看| 欧美日韩激情视频一区二区三区| 激情综合网最新| 国产精品激情av电影在线观看 | 三级中文字幕在线观看| 亚洲日本一区二区| 日本在线观看一区二区三区| 天堂av在线免费| 伊人久久大香线蕉av不卡| 日韩欧美高清dvd碟片| 亚洲视频一二三四| 免费观看的av网站| 久草中文综合在线| 国产精品揄拍一区二区| 日本在线播放视频| 日韩欧美一区二区三区免费观看 | 亚洲图区综合网| 亚洲人和日本人hd| 日韩精品一区在线观看| 久久精品免费网站| 三级a性做爰视频| 99九九热只有国产精品| 亚洲精品欧美在线| 蜜桃91精品入口| av一级在线观看| 美女视频在线免费| 国产乱子伦视频一区二区三区| 在线一区二区三区四区五区 | 精品少妇一区二区三区在线播放| 综合一区中文字幕| 国产美女明星三级做爰| 日本我和搜子同居的日子高清在线| 日本不卡视频在线观看| 久久精彩免费视频| 在线观看免费视频黄| www 日韩| 成人综合激情网| 欧美激情小视频| 免费黄色三级网站| 激情文学综合| 99av国产精品欲麻豆| 亚洲欧美国产高清va在线播| 毛片网站免费观看| 97香蕉久久| 美女被久久久| 国产一区二区香蕉| 久久高清免费视频| 亚洲欧美成人影院| 美洲天堂一区二卡三卡四卡视频| 国产第一区电影| 国产女人被狂躁到高潮小说| 国模吧精品人体gogo| 国产精品国产三级国产aⅴ入口| 国产精品久久综合av爱欲tv| 麻豆成人在线视频| 在线视频观看国产| 欧美激情一区二区三区四区| 亚洲在线视频观看| 日本视频在线观看免费| gogo久久日韩裸体艺术| 717成人午夜免费福利电影| 成人午夜精品久久久久久久蜜臀| 午夜免费性福利| 韩国精品免费视频| 国产精品日韩av| 无码国产精品一区二区色情男同 | 青花影视在线观看免费高清| 国产精品久久久久久久龚玥菲| 亚洲丝袜美腿综合| 亚洲ai欧洲av| 好男人官网在线观看| 夜夜精品视频| 欧美激情综合色| 99久久精品久久亚洲精品| 青青在线观看视频中文字| 国产一区导航| 欧美亚洲日本黄色| 日本三级欧美三级| 欧美18免费视频| 亚洲а∨天堂久久精品9966| 国产免费中文字幕| 免费av不卡| 91传媒理伦片在线观看| 亚洲av午夜精品一区二区三区| 一个人看的www视频免费观看| 欧美一区免费| 国产精品成人一区| 日韩伦人妻无码| 久草在线资源福利站| 欧美一区二区三区免费在线看| 在线一区二区不卡| 在线观看中文字幕| 美女免费视频一区二区| 久久久久久国产精品mv| 四虎免费在线观看| 成人羞羞网站入口| 国产裸体写真av一区二区| 波多野结衣啪啪| 中文字幕久久精品一区二区| 九九久久综合网站| 国产亚洲成人精品| av黄色在线看| 免费黄色三级网站| 性色视频在线| 91丨九色丨黑人外教| 欧美伦理一区二区| av中文网站| 国产精品7m凸凹视频分类| 成人久久久久久久| 亚洲天堂狠狠干| 婷婷亚洲成人| 国产成人精品a视频一区www| 成人免费一区二区三区| 精品视频高潮| 国产精品久久久| www.五月激情| 欧美成人久久| 另类欧美小说| 国产情侣高潮对白| 日韩成人午夜精品| 亚洲激情免费视频| 可以免费观看av的网站| 日批视频免费观看| 国产精品亚洲欧美一级在线| 欧美福利视频一区| 日本一级片免费| 中老年在线免费视频| 欧美性大战久久久久久久| 日本黄xxxxxxxxx100| jizz亚洲| 亚洲国产成人va在线观看天堂| 国产a级片网站| 国产偷倩在线播放| 欧美日韩视频不卡| 人妻无码一区二区三区| 久久伦理中文字幕| 国产亚洲欧洲高清| 国产第一页在线播放| 欧美日本一区二区视频在线观看 | 不卡大黄网站免费看| 国产精品日韩欧美一区二区三区| 亚洲第一香蕉视频| 99久久精品免费| 欧美另类videos| 99免费看香蕉视频| 国产99久久精品| 91色国产在线| 欧美日韩在线资源| 亚洲第一成人在线| 精品在线观看一区| 精品国产鲁一鲁****| 欧美日韩在线不卡| 国产精品第5页| 精品日韩毛片| 国产成人精品av| 中文字幕2019第三页| 国产喂奶挤奶一区二区三区| 亚洲欧洲一区二区福利| 国产超碰在线观看| 亚洲一区二区四区蜜桃| youjizz亚洲女人| 国产麻豆精品| 日韩中文视频免费在线观看| 天天干天天色天天| 久久午夜av| 日韩av在线高清| 97人妻一区二区精品视频| 欧美性感美女一区二区| 日韩av电影国产| 天天做天天摸天天爽天天爱| 亚洲欧洲精品一区二区精品久久久| 99蜜桃臀久久久欧美精品网站| 欧美大电影免费观看| 亚洲欧美国内爽妇网| 特一级黄色大片| 奇米影视一区二区三区| 日韩免费中文专区| 国产一二三四| 亚洲精品一二三| 韩国一区二区三区四区| 爱福利在线视频| 中文字幕日韩专区| 国产真人无遮挡作爱免费视频| 免费观看成人鲁鲁鲁鲁鲁视频| 视频一区视频二区视频| 99精产国品一二三产品香蕉| 91精品国产综合久久精品 | 欧美怡红院视频| 2018国产精品| 九色porny丨国产首页在线| 欧美成人在线免费| aaa国产视频| 视频在线观看国产精品| 亚洲成人av免费看| 成人爽a毛片免费啪啪动漫| 精品国产在天天线2019| 中文乱码字幕午夜无线观看| 国产毛片一区二区| 凹凸国产熟女精品视频| 一区二区三区免费在线看| 国产成人精品电影久久久| 国产 欧美 自拍| 日韩美女视频一区二区| 国产精品一区二区无码对白| 青青草国产免费一区二区下载| 亚洲a在线播放| 99re免费99re在线视频手机版| 欧美一区二区视频网站| 久久不卡免费视频| 亚洲伦理精品| 亚洲伊人伊色伊影伊综合网| 在哪里可以看毛片| 加勒比色综合久久久久久久久 | 大肉大捧一进一出好爽动态图| 日韩av一二三四| 一级毛片免费视频| 日韩欧美成人网| 搜索黄色一级片| 国内揄拍国内精品久久| 一本久道久久综合| 国产精品第一国产精品| 亚洲码国产岛国毛片在线| 国产精品久久久久野外| 亚洲综合小说| 色播亚洲视频在线观看| 免费在线观看的电影网站| 日日噜噜噜夜夜爽亚洲精品| 特级xxxxx欧美| 欧美日韩在线免费视频| 在线精品免费视| 蜜臀av一级做a爰片久久| 成年人网站免费在线观看| 国产一区二区三区日韩精品| 免费国产黄色网址| 忘忧草在线www成人影院| 97在线日本国产| 黄色在线免费观看大全| 亚洲免费视频网站| 欧美在线|欧美| 亚欧洲精品在线视频| 99天天综合性| 亚洲天堂av网站| 亚洲国产国产| 日韩av片在线看| 欧美xxxx做受欧美护士| 精品久久五月天| 成年人三级网站| 欧美日韩精品综合在线| 精品国内自产拍在线视频| 亚洲国产成人av网| 久久久久亚洲av无码专区体验| 成人av网址在线| aaaa黄色片| 久久国产精品色婷婷| 中文字幕第一页在线视频| 欧美激情99| 欧美精品无码一区二区三区| 免费一级欧美在线大片| 国产一二三四区在线观看| 日本.亚洲电影| 大尺度做爰床戏呻吟舒畅| 激情网站在线| 51精品国自产在线| 亚洲精品一区二区三区影院忠贞| melody高清在线观看| 亚洲精品wwwww| 中文字幕在线2021|