the_deepest 5 дней назад
Родитель
Сommit
c72fee9dc7
4 измененных файлов: 61 добавлений и 68 удалений
  1. +14
    -14
      iar/settings/F407_uCOSii_Modbus.wsdt
  2. +8
    -4
      iar/settings/uCOS_Modbus.dbgdt
  3. +19
    -20
      iar/settings/uCOS_Modbus.dnx
  4. +20
    -30
      modbus/modbus.c

+ 14
- 14
iar/settings/F407_uCOSii_Modbus.wsdt
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


+ 8
- 4
iar/settings/uCOS_Modbus.dbgdt Просмотреть файл

@@ -153,7 +153,7 @@
<RecentlyUsedMenus>1</RecentlyUsedMenus> <RecentlyUsedMenus>1</RecentlyUsedMenus>
<MenuShadows>1</MenuShadows> <MenuShadows>1</MenuShadows>
<ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay> <ShowAllMenusAfterDelay>1</ShowAllMenusAfterDelay>
<CommandsUsage>1F0200001D0013860000090000001B8F000001000000108600009100000020810000010000000D800000020000000C81000001000000048600000200000056860000EF0000001481000001000000008400000100000030840000010000001F810000050000005E8600000B0000000E810000010000000B8100000100000000E10000010000008E860000010000001486000003000000698600000100000005840000010000000086000002000000118600004A00000002840000020000000581000001000000198F000001000000468100002D00000010840000060000005D860000040000000886000002000000</CommandsUsage>
<CommandsUsage>B80200001D001B8F000001000000138600000B00000010860000CF00000020810000010000000C810000020000000D800000020000000486000002000000568600001B0100000084000001000000148100000100000030840000010000000E810000010000005E8600000B0000001F8100000B0000008E8600000100000000E10000010000000B81000001000000058400000100000069860000010000001486000003000000198F00000100000005810000010000000284000002000000118600006800000000860000020000001084000006000000468100003500000008860000020000005D86000004000000</CommandsUsage>
</MFCToolBarParameters> </MFCToolBarParameters>
<CommandManager> <CommandManager>
<CommandsWithoutImages>0400FFFFFFFF838600005886000004DC0000</CommandsWithoutImages> <CommandsWithoutImages>0400FFFFFFFF838600005886000004DC0000</CommandsWithoutImages>
@@ -625,12 +625,14 @@
<IarPane-34080> <IarPane-34080>
<MemGotoHistory> <MemGotoHistory>
<item>ModbusRxBuf</item> <item>ModbusRxBuf</item>
<item>ModbusCoil</item>
<item>ModbusTxBuf</item> <item>ModbusTxBuf</item>
<item>ModbusReg</item>
<item>rxBuf</item> <item>rxBuf</item>
</MemGotoHistory> </MemGotoHistory>
<ZoneNumber>0</ZoneNumber> <ZoneNumber>0</ZoneNumber>
<SelectionAnchor>536900356</SelectionAnchor>
<SelectionEnd>536900612</SelectionEnd>
<SelectionAnchor>536903428</SelectionAnchor>
<SelectionEnd>536903684</SelectionEnd>
<UnitsPerGroup>1</UnitsPerGroup> <UnitsPerGroup>1</UnitsPerGroup>
<EndianMode>0</EndianMode> <EndianMode>0</EndianMode>
<DataCovEnabled>0</DataCovEnabled> <DataCovEnabled>0</DataCovEnabled>
@@ -638,7 +640,7 @@
<AutoRefresh>0</AutoRefresh> <AutoRefresh>0</AutoRefresh>
<FindAsHex>0</FindAsHex> <FindAsHex>0</FindAsHex>
<HScroll>0</HScroll> <HScroll>0</HScroll>
<VScroll>33556267</VScroll>
<VScroll>33556459</VScroll>
</IarPane-34080> </IarPane-34080>
<Pane-34081> <Pane-34081>
<ID>34081</ID> <ID>34081</ID>
@@ -1012,6 +1014,8 @@
<item>j</item> <item>j</item>
<item>i</item> <item>i</item>
<item>indexR</item> <item>indexR</item>
<item>readVal</item>
<item>data</item>
<item></item> <item></item>
</expressions> </expressions>
<col-names> <col-names>


+ 19
- 20
iar/settings/uCOS_Modbus.dnx Просмотреть файл

@@ -16,15 +16,15 @@
<ShowSource>1</ShowSource> <ShowSource>1</ShowSource>
</Trace1> </Trace1>
<StLinkDriver> <StLinkDriver>
<CStepIntDis>_ 0</CStepIntDis>
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>0</stlinkResetStrategy>
<stlinkserialNo>30303031</stlinkserialNo> <stlinkserialNo>30303031</stlinkserialNo>
<stlinkfoundProbes /> <stlinkfoundProbes />
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>0</stlinkResetStrategy>
<CStepIntDis>_ 0</CStepIntDis>
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
</StLinkDriver> </StLinkDriver>
<DebugChecksum> <DebugChecksum>
<Checksum>4279408766</Checksum>
<Checksum>3595631932</Checksum>
</DebugChecksum> </DebugChecksum>
<Exceptions> <Exceptions>
<StopOnUncaught>_ 0</StopOnUncaught> <StopOnUncaught>_ 0</StopOnUncaught>
@@ -120,22 +120,15 @@
<ShowTimeSum>1</ShowTimeSum> <ShowTimeSum>1</ShowTimeSum>
<SumSortOrder>0</SumSortOrder> <SumSortOrder>0</SumSortOrder>
</EventLog> </EventLog>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>
<Breakpoints2>
<Bp0>_ 1 "EMUL_CODE" "{$PROJ_DIR$\..\modbus\modbus.c}.176.17" 0 0 1 "" 0 "" 0</Bp0>
<Count>1</Count>
</Breakpoints2>
<TermIOLog>
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
</TermIOLog>
<LogFile> <LogFile>
<LoggingEnabled>_ 0</LoggingEnabled> <LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile> <LogFile>_ ""</LogFile>
<Category>_ 0</Category> <Category>_ 0</Category>
</LogFile> </LogFile>
<Aliases>
<Count>0</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
<DriverProfiling> <DriverProfiling>
<Enabled>0</Enabled> <Enabled>0</Enabled>
<Mode>3</Mode> <Mode>3</Mode>
@@ -149,8 +142,14 @@
<CallStackStripe> <CallStackStripe>
<ShowTiming>1</ShowTiming> <ShowTiming>1</ShowTiming>
</CallStackStripe> </CallStackStripe>
<TermIOLog>
<LoggingEnabled>_ 0</LoggingEnabled>
<LogFile>_ ""</LogFile>
</TermIOLog>
<DisassembleMode>
<mode>0</mode>
</DisassembleMode>
<Breakpoints2>
<Count>0</Count>
</Breakpoints2>
<Aliases>
<Count>0</Count>
<SuppressDialog>0</SuppressDialog>
</Aliases>
</settings> </settings>

+ 20
- 30
modbus/modbus.c Просмотреть файл

@@ -5,7 +5,7 @@
#include "modbus.h" #include "modbus.h"


extern OS_EVENT* ModbusWriteFlash; /*接收到modbus写入coil请求报文*/ extern OS_EVENT* ModbusWriteFlash; /*接收到modbus写入coil请求报文*/
extern OS_EVENT* ModbusConnect; /*已接收到modbus正确报文*/
extern OS_EVENT* ModbusConnect; /*已接收到modbus正确报文*/


uint8_t ModbusErr; uint8_t ModbusErr;
/*0x270F + 1 = K10000 */ /*0x270F + 1 = K10000 */
@@ -128,28 +128,30 @@ void AppTaskModbusParse (void *p_arg)
rxLen = ModbusRxLen; rxLen = ModbusRxLen;
memcpy(rxBuf, ModbusRxBuf, rxLen); memcpy(rxBuf, ModbusRxBuf, rxLen);


/*拼接crc校验码(高前低后),接收到的数据帧crc校验码是低前高后*/
/*帧分解*/
frame.crc = ((uint16_t)(rxBuf[rxLen - 2])) | ((uint16_t)rxBuf[rxLen - 1] << 8); frame.crc = ((uint16_t)(rxBuf[rxLen - 2])) | ((uint16_t)rxBuf[rxLen - 1] << 8);
frame.slaveAddres = rxBuf[0];
frame.func = rxBuf[1];
frame.opeAddres = ((uint16_t)rxBuf[2] << 8) | ((uint16_t)rxBuf[3]);
frame.opeNum = ((uint16_t)rxBuf[4] << 8) | ((uint16_t)rxBuf[5]);

/*crc校验判断*/
if(ChcekCrc16(frame.crc, rxBuf, rxLen) != 0) if(ChcekCrc16(frame.crc, rxBuf, rxLen) != 0)
{ {
/*crc校验错误,直接丢弃*/ /*crc校验错误,直接丢弃*/
ModbusErr = ERR_CRC; ModbusErr = ERR_CRC;
continue; continue;
} }

frame.slaveAddres = rxBuf[0];
/*从机地址判断*/
if(frame.slaveAddres != SLAVE_ADDRES) if(frame.slaveAddres != SLAVE_ADDRES)
{ {
/*从机地址错误,直接丢弃*/ /*从机地址错误,直接丢弃*/
ModbusErr = ERR_SLAVE_ADDRES; ModbusErr = ERR_SLAVE_ADDRES;
continue; continue;
} }
/*释放正确接收信号量*/
OSSemPost(ModbusConnect); OSSemPost(ModbusConnect);


frame.func = rxBuf[1];
frame.opeAddres = ((uint16_t)rxBuf[2] << 8) | ((uint16_t)rxBuf[3]);
frame.opeNum = ((uint16_t)rxBuf[4] << 8) | ((uint16_t)rxBuf[5]);
/*功能码分类*/ /*功能码分类*/
switch(frame.func) switch(frame.func)
{ {
@@ -164,39 +166,23 @@ void AppTaskModbusParse (void *p_arg)
case 0x0F:/*写多个线圈*/ case 0x0F:/*写多个线圈*/
frame.wNum = rxBuf[6]; frame.wNum = rxBuf[6];
memcpy(frame.wData, &rxBuf[7], frame.wNum); memcpy(frame.wData, &rxBuf[7], frame.wNum);
ModbusErr = ModbusWriteCoils(frame.opeAddres, frame.opeNum, frame.wData);
if(ModbusErr == 0)
{
OSSemPost(ModbusWriteFlash);
}
ModbusErr = ModbusWriteCoils(frame.opeAddres, frame.opeNum, frame.wData);
break; break;


case 0x10:/*写多个寄存器*/ case 0x10:/*写多个寄存器*/
frame.wNum = rxBuf[6]; frame.wNum = rxBuf[6];
memcpy(frame.wData, &rxBuf[7], frame.wNum); memcpy(frame.wData, &rxBuf[7], frame.wNum);
ModbusErr = ModbusWriteRegs(frame.opeAddres, frame.opeNum, frame.wData); ModbusErr = ModbusWriteRegs(frame.opeAddres, frame.opeNum, frame.wData);
if(ModbusErr == 0)
{
OSSemPost(ModbusWriteFlash);
}
break; break;
case 0x05:/*写单个线圈*/ case 0x05:/*写单个线圈*/
memcpy(frame.wData, &rxBuf[4], 2); memcpy(frame.wData, &rxBuf[4], 2);
ModbusErr = ModbusWriteCoil(frame.opeAddres, frame.wData); ModbusErr = ModbusWriteCoil(frame.opeAddres, frame.wData);
if(ModbusErr == 0)
{
OSSemPost(ModbusWriteFlash);
}
break; break;


case 0x06:/*写单个寄存器*/ case 0x06:/*写单个寄存器*/
memcpy(frame.wData, &rxBuf[4], 2); memcpy(frame.wData, &rxBuf[4], 2);
ModbusErr = ModbusWriteReg(frame.opeAddres, frame.wData); ModbusErr = ModbusWriteReg(frame.opeAddres, frame.wData);
if(ModbusErr == 0)
{
OSSemPost(ModbusWriteFlash);
}
break; break;


default:/*功能码错误*/ default:/*功能码错误*/
@@ -205,15 +191,19 @@ void AppTaskModbusParse (void *p_arg)
break; break;
} }
/*实现附加功能时不在这里启动发送*/ /*实现附加功能时不在这里启动发送*/
if(frame.func == 0x03 && frame.opeAddres == 0XFFFF)
{
;
}
if(frame.func == 0x03 && frame.opeAddres == 0XFFFF);
else else
{ {
/*启动发送*/
ModbusSend(ModbusTxBuf, ModbusTxLen); ModbusSend(ModbusTxBuf, ModbusTxLen);
} }

if(ModbusErr == 0 && (frame.func == 0x0F
|| frame.func == 0x10
|| frame.func == 0x05 || frame.func == 0x06))
{
/*释放写FLASH信号量*/
OSSemPost(ModbusWriteFlash);
}
} }
} }




Загрузка…
Отмена
Сохранить