This commit is contained in:
2026-02-25 15:12:13 +08:00
parent 9d69b29eed
commit 090eb335a8
25 changed files with 620 additions and 19973 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -1,835 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
<SchemaVersion>1.0</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Extensions>
<cExt>*.c</cExt>
<aExt>*.s*; *.src; *.a*</aExt>
<oExt>*.obj; *.o</oExt>
<lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc; *.md</tExt>
<pExt>*.plm</pExt>
<CppX>*.cpp; *.cc; *.cxx</CppX>
<nMigrate>0</nMigrate>
</Extensions>
<DaveTm>
<dwLowDateTime>0</dwLowDateTime>
<dwHighDateTime>0</dwHighDateTime>
</DaveTm>
<Target>
<TargetName>leakage_system</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<TargetOption>
<CLKADS>12000000</CLKADS>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
<RunSim>0</RunSim>
<RunTarget>1</RunTarget>
<RunAbUc>0</RunAbUc>
</OPTTT>
<OPTHX>
<HexSelection>1</HexSelection>
<FlashByte>65535</FlashByte>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
</OPTHX>
<OPTLEX>
<PageWidth>79</PageWidth>
<PageLength>66</PageLength>
<TabStop>8</TabStop>
<ListingPath></ListingPath>
</OPTLEX>
<ListingPage>
<CreateCListing>1</CreateCListing>
<CreateAListing>1</CreateAListing>
<CreateLListing>1</CreateLListing>
<CreateIListing>0</CreateIListing>
<AsmCond>1</AsmCond>
<AsmSymb>1</AsmSymb>
<AsmXref>0</AsmXref>
<CCond>1</CCond>
<CCode>0</CCode>
<CListInc>0</CListInc>
<CSymb>0</CSymb>
<LinkerCodeListing>0</LinkerCodeListing>
</ListingPage>
<OPTXL>
<LMap>1</LMap>
<LComments>1</LComments>
<LGenerateSymbols>1</LGenerateSymbols>
<LLibSym>1</LLibSym>
<LLines>1</LLines>
<LLocSym>1</LLocSym>
<LPubSym>1</LPubSym>
<LXref>0</LXref>
<LExpSel>0</LExpSel>
</OPTXL>
<OPTFL>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>0</CpuCode>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
<sLdApp>1</sLdApp>
<sGomain>1</sGomain>
<sRbreak>1</sRbreak>
<sRwatch>1</sRwatch>
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tGomain>1</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>0</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon>BIN\UL2CM3.DLL</pMon>
</DebugOpt>
<TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>UL2CM3</Key>
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407VGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>0</periodic>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
<aPa>0</aPa>
<viewmode>0</viewmode>
<vrSel>0</vrSel>
<aSym>0</aSym>
<aTbox>0</aTbox>
<AscS1>0</AscS1>
<AscS2>0</AscS2>
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>0</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
</DebugFlag>
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>1</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
</DebugDescription>
</TargetOption>
</Target>
<Group>
<GroupName>Application/MDK-ARM</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>1</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>startup_stm32f407xx.s</PathWithFileName>
<FilenameWithoutPath>startup_stm32f407xx.s</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Application/User/Core</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/gpio.c</PathWithFileName>
<FilenameWithoutPath>gpio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/dma.c</PathWithFileName>
<FilenameWithoutPath>dma.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/spi.c</PathWithFileName>
<FilenameWithoutPath>spi.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/usart.c</PathWithFileName>
<FilenameWithoutPath>usart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/stm32f4xx_it.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_it.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/stm32f4xx_hal_msp.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_msp.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Drivers/STM32F4xx_HAL_Driver</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_spi.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_rcc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_rcc_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_flash.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_flash_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_flash_ramfunc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_gpio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_dma_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_dma.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_pwr.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_pwr_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_cortex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_exti.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_tim.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_tim_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c</PathWithFileName>
<FilenameWithoutPath>stm32f4xx_hal_uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Drivers/CMSIS</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/system_stm32f4xx.c</PathWithFileName>
<FilenameWithoutPath>system_stm32f4xx.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>app</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>27</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\app\usr_config.h</PathWithFileName>
<FilenameWithoutPath>usr_config.h</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\app\app.c</PathWithFileName>
<FilenameWithoutPath>app.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\app\gas_data.c</PathWithFileName>
<FilenameWithoutPath>gas_data.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\app\app_timer.c</PathWithFileName>
<FilenameWithoutPath>app_timer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\app\app_leakage.c</PathWithFileName>
<FilenameWithoutPath>app_leakage.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\app\app_com.c</PathWithFileName>
<FilenameWithoutPath>app_com.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>algo</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\algo\algo_queue.c</PathWithFileName>
<FilenameWithoutPath>algo_queue.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>bsp</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_Delay.c</PathWithFileName>
<FilenameWithoutPath>bsp_Delay.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_Led.c</PathWithFileName>
<FilenameWithoutPath>bsp_Led.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_Wdg.c</PathWithFileName>
<FilenameWithoutPath>bsp_Wdg.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_Flash.c</PathWithFileName>
<FilenameWithoutPath>bsp_Flash.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_uart.c</PathWithFileName>
<FilenameWithoutPath>bsp_uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_w25q.c</PathWithFileName>
<FilenameWithoutPath>bsp_w25q.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_DS1302.c</PathWithFileName>
<FilenameWithoutPath>bsp_DS1302.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_W5500.c</PathWithFileName>
<FilenameWithoutPath>bsp_W5500.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_buzzer.c</PathWithFileName>
<FilenameWithoutPath>bsp_buzzer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\bsp\bsp_relay.c</PathWithFileName>
<FilenameWithoutPath>bsp_relay.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>gui</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\gui\gui_tjc_hmi.c</PathWithFileName>
<FilenameWithoutPath>gui_tjc_hmi.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>protocol</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\protocol\proto_modbus_lib.c</PathWithFileName>
<FilenameWithoutPath>proto_modbus_lib.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\protocol\proto_print.c</PathWithFileName>
<FilenameWithoutPath>proto_print.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\protocol\proto_modbus_slave_ex.c</PathWithFileName>
<FilenameWithoutPath>proto_modbus_slave_ex.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\usr\protocol\proto_modbus_master_leakage.c</PathWithFileName>
<FilenameWithoutPath>proto_modbus_master_leakage.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>1</RteFlg>
</Group>
</ProjectOpt>
@@ -755,16 +755,16 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\usr\protocol\proto_print.c</FilePath> <FilePath>..\usr\protocol\proto_print.c</FilePath>
</File> </File>
<File>
<FileName>proto_modbus_slave_ex.c</FileName>
<FileType>1</FileType>
<FilePath>..\usr\protocol\proto_modbus_slave_ex.c</FilePath>
</File>
<File> <File>
<FileName>proto_modbus_master_leakage.c</FileName> <FileName>proto_modbus_master_leakage.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\usr\protocol\proto_modbus_master_leakage.c</FilePath> <FilePath>..\usr\protocol\proto_modbus_master_leakage.c</FilePath>
</File> </File>
<File>
<FileName>proto_modbus_tcp_slave_ex.c</FileName>
<FileType>1</FileType>
<FilePath>..\usr\protocol\proto_modbus_tcp_slave_ex.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -29,7 +29,7 @@
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Stack_Size EQU 0x400 Stack_Size EQU 0x800
AREA STACK, NOINIT, READWRITE, ALIGN=3 AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size Stack_Mem SPACE Stack_Size
@@ -40,7 +40,7 @@ __initial_sp
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h> ; </h>
Heap_Size EQU 0x200 Heap_Size EQU 0x400
AREA HEAP, NOINIT, READWRITE, ALIGN=3 AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base __heap_base
+13 -5
View File
@@ -18,7 +18,7 @@
#include "proto_modbus_master_leakage.h" #include "proto_modbus_master_leakage.h"
#include "proto_modbus_slave_ex.h" #include "proto_modbus_tcp_slave_ex.h"
#include "gui_tjc_hmi.h" #include "gui_tjc_hmi.h"
@@ -58,7 +58,7 @@ app_timer_class_t app_timer_task[] =
void app_init(void) void app_init(void)
{ {
/*flash*/ /*flash*/
Usr_Flash.Init(); w25q32.init();
/*串口初始化*/ /*串口初始化*/
com_uart1.init(&com_uart1); com_uart1.init(&com_uart1);
@@ -82,12 +82,17 @@ void app_init(void)
modbus_leakage[APP_COM3].init(&modbus_leakage[APP_COM3]); modbus_leakage[APP_COM3].init(&modbus_leakage[APP_COM3]);
modbus_leakage[APP_COM4].init(&modbus_leakage[APP_COM4]); modbus_leakage[APP_COM4].init(&modbus_leakage[APP_COM4]);
/*外设通讯*/ /*外设*/
DS1302.Init(); DS1302.Init();
relay.init(); relay.init();
buzzer.init(); buzzer.init();
led.init(); led.init();
leakage.init();
/*com口绑定*/
app_com.init();
history.init_history();
/*分时复用,时间片轮询*/ /*分时复用,时间片轮询*/
app_timer.init(APP_TIMER_TASK_NUM,app_timer_task); app_timer.init(APP_TIMER_TASK_NUM,app_timer_task);
@@ -115,6 +120,7 @@ void task_idle(void)
com_uart3.rx_task(&com_uart3); com_uart3.rx_task(&com_uart3);
com_uart4.rx_task(&com_uart4); com_uart4.rx_task(&com_uart4);
com_uart6.rx_task(&com_uart6); com_uart6.rx_task(&com_uart6);
W5500.Task();
} }
void task_10ms(void) void task_10ms(void)
@@ -139,7 +145,10 @@ void task_200ms(void)
void task_500ms(void) void task_500ms(void)
{ {
led.task(); led.task();
//tdlas.tx_task(); modbus_leakage[APP_COM1].tx_task(&modbus_leakage[APP_COM1]);
modbus_leakage[APP_COM2].tx_task(&modbus_leakage[APP_COM2]);
modbus_leakage[APP_COM3].tx_task(&modbus_leakage[APP_COM3]);
// modbus_leakage[APP_COM4].tx_task(&modbus_leakage[APP_COM4]);
} }
@@ -147,7 +156,6 @@ void task_1s(void)
{ {
leakage.task(); leakage.task();
DS1302.Task(); DS1302.Task();
buzzer.task(); buzzer.task();
relay.task(); relay.task();
} }
+46 -87
View File
@@ -1,22 +1,15 @@
#include "app_alarm.h" #include "app_leakage.h"
#include <string.h> #include <string.h>
#include "bsp_w25q.h" #include "bsp_w25q.h"
#include "bsp_buzzer.h"
#include "bsp_relay.h"
static void history_clear_all(void); static void history_clear_all(void);
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record); static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record);
static void history_init(void); static void history_init(void);
static void history_save_metadata(void); static void history_save_metadata(void);
app_leakage_t leakage =
{
.region_num = 0,
.sub_device_num = 0,
.init = NULL,
.task = app_leakage_task
};
app_leakage_t *p_leakage = &leakage;
app_hitory_t history = app_hitory_t history =
{ {
.read_history = history_read_record, .read_history = history_read_record,
@@ -24,91 +17,75 @@ app_hitory_t history =
.init_history = history_init .init_history = history_init
}; };
/*区域分类,将同一区域名的设备划分到一起*/ /*控制 声 光 继电器 报警*/
void app_leakage_region_classify(void) static void app_leakage_alarm_contorl(void)
{ {
u16 i,j; if(0 != leakage.alarm_state)
u8 add_region_flag; {
buzzer.set.on();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_ON);
}
else
{
buzzer.set.off();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_OFF);
}
/*数量及相关数据清零*/ /*漏液状态*/
p_leakage->region_num = 0; if(leakage.alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
p_leakage->sub_device_num = 0;
memset(p_leakage->region_data,0,sizeof(p_leakage->region_data));
/*遍历子系统*/
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_NUM;i++)
{ {
add_region_flag = 1; /*添加新区域*/ relay.set(BSP_RELAY_CH_LEAKAGE,USR_ON);
/*设备使能*/ }
if(ENABLE == p_leakage->sub_device_data[i].flash_data.state) else
{ {
p_leakage->sub_device_num++;/*子系统总数量++*/ relay.set(BSP_RELAY_CH_LEAKAGE,USR_OFF);
/*遍历区域*/ }
for(j=0;j<APP_LEAKAGE_SUB_DEVICE_NUM;j++) /*断带状态*/
if(leakage.alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{ {
if(0 == memcmp(p_leakage->region_data[j].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN))/*名称相同*/ relay.set(BSP_RELAY_CH_OPEN,USR_ON);
}
else
{ {
/*添加子设备*/ relay.set(BSP_RELAY_CH_OPEN,USR_OFF);
p_leakage->region_data[j].sub_device_index[p_leakage->region_data[j].leakage_num] = i;/*绑定子设备索引*/ }
p_leakage->region_data[j].sub_device_num++; /*区域中子系统数据++*/ /*通讯超时*/
add_region_flag = 0;/*不添加新区域*/ if(leakage.alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
break; {
relay.set(BSP_RELAY_CH_COMMINCAION,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_OFF);
} }
} }
/*没有找到相同名称*/
if(add_region_flag)/*添加新区域*/
{
/*复制名称*/
memcpy(p_leakage->region_data[p_leakage->region_num].name,p_leakage->sub_device_data[i].flash_data.region_name, APP_LEAKAGE_STRING_NANE_LEN);
p_leakage->region_data[p_leakage->region_num].sub_device_index[p_leakage->region_data[p_leakage->region_num].leakage_num] = i;/*绑定子设备索引*/
p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*区域中子系统数据++*/
p_leakage->region_num++; /*区域数量++*/
}
}
}
}
/*异常状态设备数量统计*/ /*异常状态设备数量统计*/
void app_leakage_task(void) void app_leakage_task(void)
{ {
static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0}; static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0};
u16 i, j, k, sub_device_index; u16 i, j, k, sub_device_index;
static u8 initialized = 0;
/* 初始化历史模块 */
if(!initialized)
{
history.init_history();
initialized = 1;
}
/* 初始化区域异常统计 */
for(i = 0; i < p_leakage->region_num; i++)
{
p_leakage->region_data[i].leakage_num = 0;
p_leakage->region_data[i].open_num = 0;
p_leakage->region_data[i].time_out_num = 0;
}
/* 检测状态变化并统计异常数量 */ /* 检测状态变化并统计异常数量 */
for(i = 0; i < p_leakage->region_num; i++) for(i = 0; i < leakage.region_num; i++)
{ {
for(j = 0; j < p_leakage->region_data[i].sub_device_num; j++) for(j = 0; j < leakage.region_data[i].sub_device_num; j++)
{ {
sub_device_index = p_leakage->region_data[i].sub_device_index[j]; sub_device_index = leakage.region_data[i].sub_device_index[j];
/* 检查设备是否启用 */ /* 检查设备是否启用 */
if(p_leakage->sub_device_data[sub_device_index].flash_data.state != ENABLE) if(leakage.sub_device_data[sub_device_index].flash_data.state != ENABLE)
{ {
continue; continue;
} }
/*历史报警存储*/
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++) for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{ {
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state; u16 current_state = leakage.sub_device_data[sub_device_index].ch_data[k].state;
u16 prev_state = prev_ch_state[sub_device_index][k]; u16 prev_state = prev_ch_state[sub_device_index][k];
u16 leak_distance = p_leakage->sub_device_data[sub_device_index].ch_data[k].distance; u16 leak_distance = leakage.sub_device_data[sub_device_index].ch_data[k].distance;
/* 检测状态变化并记录历史报警 */ /* 检测状态变化并记录历史报警 */
if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) && if((current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) &&
@@ -136,28 +113,10 @@ void app_leakage_task(void)
prev_ch_state[sub_device_index][k] = current_state; prev_ch_state[sub_device_index][k] = current_state;
} }
/* 统计区域异常设备数量 - 按设备统计 */
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
p_leakage->region_data[i].time_out_num++;
continue; /* 通讯超时,设备已离线,不再检查其他异常 */
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
p_leakage->region_data[i].open_num++;
}
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
p_leakage->region_data[i].leakage_num++;
}
}
} }
} }
/*报警控制 声光报警*/
app_leakage_alarm_contorl();
} }
/* 获取当前时间 */ /* 获取当前时间 */
+1 -63
View File
@@ -2,57 +2,7 @@
#define _APP_ALARM_H_ #define _APP_ALARM_H_
#include "main.h" #include "main.h"
#include "app_leakage.h"
#define ENABLE (1)
#define DISABLE (0)
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*通讯超时*/
#define APP_LEAKAGE_STRING_NANE_LEN (10)
#define APP_LEAKAGE_SUB_DEVICE_NUM (32)
#define APP_LEAKAGE_SUB_DEVICE_CH_NUM (4)
void app_leakage_task(void);
void app_leakage_region_classify(void);
void history_add_alarm_record(u8 region_idx, u8 device_idx, u8 channel, u16 alarm_type, u16 leak_distance);
/*子设备存储的参数*/
typedef struct
{
u8 state; /*状态 使能 非使能*/
u8 com_port; /*端口*/
u8 modbus_id; /*modbus id*/
u8 device_name[APP_LEAKAGE_STRING_NANE_LEN]; /*设备名*/
u8 region_name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名*/
}app_leakage_sub_device_flash_data_t;
/*子设备信息*/
typedef struct
{
app_leakage_sub_device_flash_data_t flash_data; /*flash存储数据*/
struct
{
u16 state; /*状态*/
u16 distance; /*漏液距离*/
}ch_data[APP_LEAKAGE_SUB_DEVICE_CH_NUM]; /*通道数据*/
u8 heartbeat; /*心跳包,0-59循环*/
u8 test_mode; /*测试模式,0=正常,1-4=测试对应通道*/
}app_leakage_sub_device_class_t;
/*区域信息*/
typedef struct
{
u8 leakage_num; /*漏液数量*/
u8 open_num; /*断带数量*/
u8 time_out_num; /*通讯超时数量*/
u8 sub_device_num; /*设备总数量*/
u8 name[APP_LEAKAGE_STRING_NANE_LEN]; /*区域名称*/
u8 sub_device_index[APP_LEAKAGE_SUB_DEVICE_NUM]; /*设备的索引*/
}app_leakage_region_data_class_t;
/* 历史报警记录结构 */ /* 历史报警记录结构 */
typedef struct typedef struct
@@ -75,18 +25,6 @@ typedef struct
u32 max_records; /* 最大记录数 */ u32 max_records; /* 最大记录数 */
} app_leakage_history_metadata_t; } app_leakage_history_metadata_t;
typedef struct
{
u8 region_num;
u8 sub_device_num;
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
app_leakage_history_metadata_t history_metadata;
void (*init)(void); /*初始化*/
void (*task)(void); /*执行任务*/
}app_leakage_t;
typedef struct typedef struct
{ {
+13 -14
View File
@@ -8,34 +8,33 @@ bsp_uart_t *com_to_uart[APP_COM_NUM] =
&com_uart4, &com_uart4,
&com_uart2, &com_uart2,
&com_uart3, &com_uart3,
&com_uart1, &com_uart6,
}; };
static void app_com_uart_baud_rate_set(app_com_class_t * p_com,u16 baud_rate); static void app_com_uart_class_rate_set(app_com_class_t * p_com,u16 baud_rate);
static void app_com_class_update(void ); static void app_com_class_update(void );
static void app_com_init(app_com_class_t * p_com); static void app_com_init(void);
app_com_t app_com= app_com_t app_com=
{ {
.init = app_com_init,
.class_update = app_com_class_update,
}; };
static void app_com_init(app_com_class_t * p_com) static void app_com_init(void)
{ {
if(p_com == &app_com.com[APP_COM1]) u8 i;
p_com->com_uart = com_to_uart[APP_COM1]; for(i=0;i<APP_COM_NUM;i++)
else if(p_com == &app_com.com[APP_COM2]) {
p_com->com_uart = com_to_uart[APP_COM2]; app_com.com[i].com_uart = com_to_uart[i];
else if(p_com == &app_com.com[APP_COM3]) }
p_com->com_uart = com_to_uart[APP_COM3]; app_com_class_update();
else if(p_com == &app_com.com[APP_COM4])
p_com->com_uart = com_to_uart[APP_COM4];
} }
/*串口配置*/ /*串口配置*/
static void app_com_uart_baud_rate_set(app_com_class_t * p_com,u16 baud_rate) static void app_com_class_baud_rate_set(app_com_class_t * p_com,u16 baud_rate)
{ {
p_com->com_uart->set.baud_rate(p_com->com_uart,baud_rate); p_com->com_uart->set.baud_rate(p_com->com_uart,baud_rate);
} }
+2 -1
View File
@@ -28,12 +28,13 @@ struct app_com_class_t
{ {
void (*baud_rate)(app_com_class_t *,u16); /*设置波特率*/ void (*baud_rate)(app_com_class_t *,u16); /*设置波特率*/
}set; }set;
void (*init)(app_com_class_t *); /*初始化*/ //void (*init)(app_com_class_t *); /*初始化*/
}; };
typedef struct typedef struct
{ {
app_com_class_t com[APP_COM_NUM]; app_com_class_t com[APP_COM_NUM];
void (*init)(void); /*初始化*/
void (*class_update)(void ); /*com区域分类*/ void (*class_update)(void ); /*com区域分类*/
}app_com_t; }app_com_t;
+68 -18
View File
@@ -2,18 +2,23 @@
#include <string.h> #include <string.h>
#include "bsp_w25q.h" #include "bsp_w25q.h"
#include "bsp_buzzer.h"
#include "bsp_relay.h"
static void history_clear_all(void); static void history_clear_all(void);
static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record); static u8 history_read_record(u32 record_index, app_leakage_history_alarm_t *record);
static void history_init(void); static void history_init(void);
static void history_save_metadata(void); static void history_save_metadata(void);
static void app_leakage_init(void);
app_leakage_t leakage = app_leakage_t leakage =
{ {
.region_num = 0, .region_num = 0,
.sub_device_num = 0, .sub_device_num = 0,
.init = NULL, .init = app_leakage_init,
.task = app_leakage_task .task = app_leakage_task,
.class_update = app_leakage_region_classify,
}; };
app_leakage_t *p_leakage = &leakage; app_leakage_t *p_leakage = &leakage;
@@ -24,6 +29,12 @@ app_hitory_t history =
.init_history = history_init .init_history = history_init
}; };
static void app_leakage_init(void)
{
app_leakage_region_classify();
}
/*区域分类,将同一区域名的设备划分到一起*/ /*区域分类,将同一区域名的设备划分到一起*/
void app_leakage_region_classify(void) void app_leakage_region_classify(void)
{ {
@@ -66,26 +77,60 @@ void app_leakage_region_classify(void)
p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*区域中子系统数据++*/ p_leakage->region_data[p_leakage->region_num].sub_device_num++; /*区域中子系统数据++*/
p_leakage->region_num++; /*区域数量++*/ p_leakage->region_num++; /*区域数量++*/
} }
} }
} }
} }
/*控制 声 光 继电器 报警*/
static void app_leakage_alarm_contorl(void)
{
if(0 != p_leakage->alarm_state)
{
buzzer.set.on();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_ON);
}
else
{
buzzer.set.off();
relay.set(BSP_RELAY_CH_ERROR_STATE,USR_OFF);
}
/*漏液状态*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{
relay.set(BSP_RELAY_CH_LEAKAGE,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_LEAKAGE,USR_OFF);
}
/*断带状态*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{
relay.set(BSP_RELAY_CH_OPEN,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_OPEN,USR_OFF);
}
/*通讯超时*/
if(p_leakage->alarm_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_ON);
}
else
{
relay.set(BSP_RELAY_CH_COMMINCAION,USR_OFF);
}
}
/*异常状态设备数量统计*/ /*异常状态设备数量统计*/
void app_leakage_task(void) void app_leakage_task(void)
{ {
static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0}; static u16 prev_ch_state[APP_LEAKAGE_SUB_DEVICE_NUM][APP_LEAKAGE_SUB_DEVICE_CH_NUM] = {0};
u16 i, j, k, sub_device_index; u16 i, j, k, sub_device_index;
static u8 initialized = 0;
/* 初始化历史模块 */
if(!initialized)
{
history.init_history();
initialized = 1;
}
/* 初始化区域异常统计 */ /* 初始化区域异常统计 */
for(i = 0; i < p_leakage->region_num; i++) for(i = 0; i < p_leakage->region_num; i++)
@@ -94,7 +139,7 @@ void app_leakage_task(void)
p_leakage->region_data[i].open_num = 0; p_leakage->region_data[i].open_num = 0;
p_leakage->region_data[i].time_out_num = 0; p_leakage->region_data[i].time_out_num = 0;
} }
p_leakage->alarm_state = 0;
/* 检测状态变化并统计异常数量 */ /* 检测状态变化并统计异常数量 */
for(i = 0; i < p_leakage->region_num; i++) for(i = 0; i < p_leakage->region_num; i++)
{ {
@@ -108,6 +153,7 @@ void app_leakage_task(void)
continue; continue;
} }
/*历史报警存储*/
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++) for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{ {
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state; u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
@@ -141,7 +187,6 @@ void app_leakage_task(void)
} }
/* 统计区域异常设备数量 - 按设备统计 */ /* 统计区域异常设备数量 - 按设备统计 */
for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++) for(k = 0; k < APP_LEAKAGE_SUB_DEVICE_CH_NUM; k++)
{ {
u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state; u16 current_state = p_leakage->sub_device_data[sub_device_index].ch_data[k].state;
@@ -149,19 +194,24 @@ void app_leakage_task(void)
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT) if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT)
{ {
p_leakage->region_data[i].time_out_num++; p_leakage->region_data[i].time_out_num++;
continue; /* 通讯超时,设备已离线,不再检查其他异常 */ p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT;
} }
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN) else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_OPEN)
{ {
p_leakage->region_data[i].open_num++; p_leakage->region_data[i].open_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
} }
if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE) else if(current_state & APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE)
{ {
p_leakage->region_data[i].leakage_num++; p_leakage->region_data[i].leakage_num++;
p_leakage->alarm_state |= APP_LEAKAGE_SUB_DEVICE_STATE_OPEN;
} }
} }
} }
} }
/*报警控制 声光报警*/
app_leakage_alarm_contorl();
} }
/* 获取当前时间 */ /* 获取当前时间 */
+8 -3
View File
@@ -8,7 +8,7 @@
#define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/ #define APP_LEAKAGE_SUB_DEVICE_STATE_LEAKAGE (0x0001) /*漏液状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/ #define APP_LEAKAGE_SUB_DEVICE_STATE_OPEN (0x0002) /*断带状态*/
#define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0xf000) /*通讯超时*/ #define APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT (0x8000) /*通讯超时*/
#define APP_LEAKAGE_STRING_NANE_LEN (10) #define APP_LEAKAGE_STRING_NANE_LEN (10)
#define APP_LEAKAGE_SUB_DEVICE_NUM (32) #define APP_LEAKAGE_SUB_DEVICE_NUM (32)
@@ -79,13 +79,18 @@ typedef struct
{ {
u8 region_num; u8 region_num;
u8 sub_device_num; u8 sub_device_num;
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM]; u16 alarm_state; /*系统报警状态*/
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
/*区域*/
app_leakage_region_data_class_t region_data[APP_LEAKAGE_SUB_DEVICE_NUM];
/*子设备*/
app_leakage_sub_device_class_t sub_device_data[APP_LEAKAGE_SUB_DEVICE_NUM];
/*历史报警*/
app_leakage_history_metadata_t history_metadata; app_leakage_history_metadata_t history_metadata;
void (*init)(void); /*初始化*/ void (*init)(void); /*初始化*/
void (*task)(void); /*执行任务*/ void (*task)(void); /*执行任务*/
void (*class_update)(void);
}app_leakage_t; }app_leakage_t;
typedef struct typedef struct
+6 -31
View File
@@ -1,21 +1,7 @@
/**********************************************************************************
* 文件名 W5500.c
* 描述 :W5500 驱动函数库
* 库版本 ST_v3.5
* 作者 :泥人通信模块开发团队
* 博客 http://nirenelec.blog.163.com
* 淘宝 http://nirenelec.taobao.com
**********************************************************************************/
//#include "stm32f1xx.h"
//#include "stm32f1xx_hal_spi.h"
#include "main.h"
#include "bsp_W5500.h" #include "bsp_W5500.h"
#include "usart.h" #include "usart.h"
#include "stdio.h" #include "stdio.h"
#include "spi.h" #include "spi.h"
//#include "bsp_print.h"
#define BSP_W5500_SPI_CS_LOW #define BSP_W5500_SPI_CS_LOW
@@ -41,12 +27,10 @@ static void Write_SOCK_Data_Buffer(bsp_W5500_Class_t *pW5500_Class, u8 *dat_ptr,
bsp_W5500_t W5500 = bsp_W5500_t W5500 =
{ {
.Gateway_IP = {192,168,1,1}, .Gateway_IP = {192,168,100,1}, /*网关IP地址*/
.Sub_Mask = {255,255,255,0}, /*子网掩码*/ .Sub_Mask = {255,255,255,0}, /*子网掩码*/
.Phy_Addr = {0x0c,0x29,0xab,0x7c,0x00,0x01}, .Phy_Addr = {0x0c,0x29,0xab,0x7c,0x00,0x01}, /*物理地址(MAC)*/
.IP_Addr = {192,168,100,101}, /*本机IP地址*/
//.IP_Addr = {169,254,107,101},
.IP_Addr = {192,168,100,101},
.Interrupt_Process = bsp_W5500_Interrupt_Process, .Interrupt_Process = bsp_W5500_Interrupt_Process,
@@ -57,18 +41,8 @@ bsp_W5500_t W5500 =
.W5500_Class[0] = .W5500_Class[0] =
{ {
.SocketPort = 0, /*使用端口0*/ .SocketPort = 0, /*使用端口0*/
.ConfigData.Gateway_IP = {192,168,1,1}, .ConfigData.Port = {0x01,0xF6},
.ConfigData.Sub_Mask = {255,255,255,0},
.ConfigData.Phy_Addr = {0x0c,0x29,0xab,0x7c,0x00,0x01},
.ConfigData.IP_Addr = {192,168,100,101},
.ConfigData.Port = {0x13,0x88},
// .ConfigData.DIP = {192,168,1,32},
// .ConfigData.DPort = {0x03,0x09},
.Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER, .Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER,
// .Rx_DataAnalysis = proto_HSMS_Rx_DataAnalysis,
}, },
}; };
@@ -798,9 +772,10 @@ static void bsp_W5500_Task(void)
// Write_SOCK_Data_Buffer(&pW5500->W5500_Class[i], pW5500->W5500_Class[i].Rx_Buffer, Len); // Write_SOCK_Data_Buffer(&pW5500->W5500_Class[i], pW5500->W5500_Class[i].Rx_Buffer, Len);
// printf("RX"); // printf("RX");
// Debug_UartSend(pW5500->W5500_Class[i].Rx_Buffer, Len); // Debug_UartSend(pW5500->W5500_Class[i].Rx_Buffer, Len);
if(pW5500->W5500_Class[i].Rx_DataAnalysis != NULL) if(pW5500->W5500_Class[i].Rx_DataAnalysis != NULL)
{ {
pW5500->W5500_Class[i].Rx_DataAnalysis(&pW5500->W5500_Class[i],pW5500->W5500_Class[i].Rx_Buffer,Len);/*数据解析*/ pW5500->W5500_Class[i].Rx_DataAnalysis(pW5500->W5500_Class[i].Rx_Buffer,Len,&pW5500->W5500_Class[i]);/*数据解析*/
} }
} }
} }
+5 -10
View File
@@ -215,11 +215,10 @@
#define W5500_INT_PORT W5500_INT_GPIO_Port #define W5500_INT_PORT W5500_INT_GPIO_Port
typedef u8 SOCKET; // 自定义端口号数据类型 typedef u8 SOCKET; // 自定义端口号数据类型
#define BSP_W5500_PORT_NUM 1 #define BSP_W5500_PORT_NUM 1
#define BSP_W5500_DATA_LEN 2048
#define BSP_W5500_TX_DATA_LEN 2048
#define BSP_W5500_RX_DATA_LEN 2048
typedef struct bsp_W5500_Class_t bsp_W5500_Class_t; typedef struct bsp_W5500_Class_t bsp_W5500_Class_t;
@@ -229,10 +228,6 @@ struct bsp_W5500_Class_t
struct struct
{ {
/***************----- 网络参数变量定义 -----***************/ /***************----- 网络参数变量定义 -----***************/
u8 Gateway_IP[4]; /*网关IP地址*/
u8 Sub_Mask[4]; /*子网掩码*/
u8 Phy_Addr[6]; /*物理地址(MAC)*/
u8 IP_Addr[4]; /*本机IP地址*/
u8 Port[2]; /*端口0的端口号(5000) */ u8 Port[2]; /*端口0的端口号(5000) */
u8 DIP[4]; /*端口0目的IP地址*/ u8 DIP[4]; /*端口0目的IP地址*/
u8 DPort[2]; /*端口0目的端口号(6000)*/ u8 DPort[2]; /*端口0目的端口号(6000)*/
@@ -247,12 +242,12 @@ struct bsp_W5500_Class_t
/***************----- 端口收发数据的状态 -----***********/ /***************----- 端口收发数据的状态 -----***********/
u8 TR_Data_State; u8 TR_Data_State;
/***************----- 端口数据缓冲区 -----***************/ /***************----- 端口数据缓冲区 -----***************/
u8 Rx_Buffer[BSP_W5500_DATA_LEN]; // 端口接收数据缓冲区 u8 Rx_Buffer[BSP_W5500_RX_DATA_LEN]; // 端口接收数据缓冲区
u8 Tx_Buffer[BSP_W5500_DATA_LEN]; // 端口发送数据缓冲区 u8 Tx_Buffer[BSP_W5500_TX_DATA_LEN]; // 端口发送数据缓冲区
u8 Interrupt; // W5500中断标志(0:无中断,1:有中断) u8 Interrupt; // W5500中断标志(0:无中断,1:有中断)
void (*Rx_DataAnalysis)(bsp_W5500_Class_t *,u8 *,u16 ); void (*Rx_DataAnalysis)(u8 *,u16 ,void *);
}; };
+19 -18
View File
@@ -340,20 +340,21 @@ static void bsp_uart_dma_send(bsp_uart_t *p_uart, u8 *p_data, u16 len)
/* 拷贝数据到发送缓冲区 */ /* 拷贝数据到发送缓冲区 */
memcpy(p_uart->tx_addr, p_data, len); memcpy(p_uart->tx_addr, p_data, len);
/* 启动DMA发送 */ HAL_UART_Transmit(p_uart->uart, p_uart->tx_addr, len,50);
HAL_UART_Transmit_DMA(p_uart->uart, p_uart->tx_addr, len); // /* 启动DMA发送 */
// HAL_UART_Transmit_DMA(p_uart->uart, p_uart->tx_addr, len);
/* 等待发送完成,带超时检测 */ //
tick_start = HAL_GetTick(); // /* 等待发送完成,带超时检测 */
while(!p_uart->tx_dma_complete_flag) // tick_start = HAL_GetTick();
{ // while(!p_uart->tx_dma_complete_flag)
tick = HAL_GetTick(); // {
if((tick - tick_start) > 200) /* 200ms超时 */ // tick = HAL_GetTick();
{ // if((tick - tick_start) > 200) /* 200ms超时 */
p_uart->tx_dma_complete_flag = 1; // {
break; // p_uart->tx_dma_complete_flag = 1;
} // break;
} // }
// }
} }
/****************************************** /******************************************
@@ -520,10 +521,10 @@ static void bsp_uart_rx_task(bsp_uart_t *p_uart)
{ {
p_uart->rx_data_analysis(rx_temp_buff, p_uart->rx_len, p_uart); p_uart->rx_data_analysis(rx_temp_buff, p_uart->rx_len, p_uart);
} }
if(p_uart == &com_uart6) // if(p_uart == &com_uart6)
{ // {
p_uart->send(p_uart, rx_temp_buff, p_uart->rx_len); // p_uart->send(p_uart, rx_temp_buff, p_uart->rx_len);
} // }
} }
} }
} }
+52 -1
View File
@@ -1,6 +1,10 @@
#include "bsp_w25q.h" #include "bsp_w25q.h"
#include "spi.h" #include "spi.h"
#include "main.h"
#include <string.h>
#include "app_leakage.h"
/* spi flash 片选引脚 - pb12 */ /* spi flash 片选引脚 - pb12 */
#define W25Q32_CS_LOW() HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET) #define W25Q32_CS_LOW() HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, GPIO_PIN_RESET)
@@ -46,10 +50,57 @@ w25q32_t w25q32 = {
}; };
/* 从W25Q32读取设备信息到app_leakage */
static void gui_tjc_hmi_read_device_info_from_w25q(void)
{
/* 创建一个临时缓冲区 */
app_leakage_sub_device_flash_data_t temp_buffer[APP_LEAKAGE_SUB_DEVICE_NUM];
/* 一次性读取所有设备信息 */
w25q32.read(W25Q32_DEVICE_INFO_ADDR,
(uint8_t*)temp_buffer,
DEVICE_INFO_STORAGE_SIZE);
/* 检查数据有效性 */
uint8_t data_valid = 1;
for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{
/* 如果所有字段都是0xFF,说明是空数据 */
if(temp_buffer[i].state == 0xFF &&
temp_buffer[i].com == 0xFF &&
temp_buffer[i].modbus_id == 0xFF)
{
data_valid = 0;
break;
}
}
if(data_valid)
{
/* 复制到app_leakage结构体中 */
for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{
leakage.sub_device_data[i].flash_data = temp_buffer[i];
}
}
else
{
/* Flash为空,初始化设备信息为默认值 */
for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{
memset(&leakage.sub_device_data[i].flash_data, 0,
sizeof(app_leakage_sub_device_flash_data_t));
leakage.sub_device_data[i].flash_data.state = DISABLE;
}
}
}
/* 初始化函数 */ /* 初始化函数 */
static void w25q32_init(void) { static void w25q32_init(void) {
W25Q32_CS_HIGH(); /* 初始时片选拉高 */ W25Q32_CS_HIGH(); /* 初始时片选拉高 */
w25q32_wake_up(); /* 唤醒芯片 */ w25q32_wake_up(); /* 唤醒芯片 */
gui_tjc_hmi_read_device_info_from_w25q();
} }
/* 读取芯片id */ /* 读取芯片id */
+17 -56
View File
@@ -12,8 +12,10 @@
#include "bsp_W5500.h" #include "bsp_W5500.h"
#include "bsp_uart.h" #include "bsp_uart.h"
#include "bsp_DS1302.h" #include "bsp_DS1302.h"
#include "bsp_buzzer.h"
#include "app_leakage.h" #include "app_leakage.h"
#include "app_com.h"
/*串口发送缓冲区*/ /*串口发送缓冲区*/
#define HMI_TX_BUFFER_NUM (2048) #define HMI_TX_BUFFER_NUM (2048)
@@ -47,7 +49,6 @@
static void gui_tjc_hmi_init(void); static void gui_tjc_hmi_init(void);
static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart); static void gui_tjc_hmi_communication_data_analysis(u8 *p_data, u16 len, void *rx_uart);
static void gui_tjc_hmi_read_device_info_from_w25q(void);
/*串口发送缓冲区*/ /*串口发送缓冲区*/
static u8 hmi_tx_buffer[HMI_TX_BUFFER_NUM]; static u8 hmi_tx_buffer[HMI_TX_BUFFER_NUM];
@@ -84,13 +85,18 @@ gui_tjc_hmi_t tjc_hmi =
gui_tjc_hmi_t *p_tjc_hmi = &tjc_hmi; gui_tjc_hmi_t *p_tjc_hmi = &tjc_hmi;
static void gui_tjc_hmi_class_update(void)
{
leakage.class_update();
app_com.class_update();
}
/*屏幕协议初始化*/ /*屏幕协议初始化*/
static void gui_tjc_hmi_init(void) static void gui_tjc_hmi_init(void)
{ {
com_uart1.rx_data_analysis = gui_tjc_hmi_communication_data_analysis; com_uart1.rx_data_analysis = gui_tjc_hmi_communication_data_analysis;
gui_tjc_hmi_read_device_info_from_w25q();
history.init_history();
} }
@@ -125,54 +131,6 @@ static void gui_tjc_hmi_save_password_to_w25q(void)
w25q32.write(W25Q32_PASSWORD_ADDR, p_tjc_hmi->password, 4); w25q32.write(W25Q32_PASSWORD_ADDR, p_tjc_hmi->password, 4);
} }
/* 从W25Q32读取设备信息到app_leakage */
static void gui_tjc_hmi_read_device_info_from_w25q(void)
{
/* 创建一个临时缓冲区 */
app_leakage_sub_device_flash_data_t temp_buffer[APP_LEAKAGE_SUB_DEVICE_NUM];
/* 一次性读取所有设备信息 */
w25q32.read(W25Q32_DEVICE_INFO_ADDR,
(uint8_t*)temp_buffer,
DEVICE_INFO_STORAGE_SIZE);
/* 检查数据有效性 */
uint8_t data_valid = 1;
for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{
/* 如果所有字段都是0xFF,说明是空数据 */
if(temp_buffer[i].state == 0xFF &&
temp_buffer[i].com == 0xFF &&
temp_buffer[i].modbus_id == 0xFF)
{
data_valid = 0;
break;
}
}
if(data_valid)
{
/* 复制到app_leakage结构体中 */
for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{
leakage.sub_device_data[i].flash_data = temp_buffer[i];
}
}
else
{
/* Flash为空,初始化设备信息为默认值 */
for(int i = 0; i < APP_LEAKAGE_SUB_DEVICE_NUM; i++)
{
memset(&leakage.sub_device_data[i].flash_data, 0,
sizeof(app_leakage_sub_device_flash_data_t));
leakage.sub_device_data[i].flash_data.state = DISABLE;
}
}
/* 重新分类区域 */
app_leakage_region_classify();
}
/* 将设备信息从app_leakage保存到W25Q32 */ /* 将设备信息从app_leakage保存到W25Q32 */
static void gui_tjc_hmi_save_device_info_to_w25q(void) static void gui_tjc_hmi_save_device_info_to_w25q(void)
{ {
@@ -258,12 +216,13 @@ static void gui_tjc_hmi_main_send(u8 cmd,u8 opa,u8 *p_data)
} }
char time[20]; char time[20];
sprintf(time,"20%d-%02d-%02d %02d:%02d", sprintf(time,"20%d-%02d-%02d %02d:%02d:%02d",
DS1302.Time.Year, DS1302.Time.Year,
DS1302.Time.Month, DS1302.Time.Month,
DS1302.Time.Day, DS1302.Time.Day,
DS1302.Time.Hour, DS1302.Time.Hour,
DS1302.Time.Minute); DS1302.Time.Minute,
DS1302.Time.Second);
len += gui_tjc_hmi_tx_text_display(0,0,(char *)&hmi_tx_buffer[len],"%s",time); len += gui_tjc_hmi_tx_text_display(0,0,(char *)&hmi_tx_buffer[len],"%s",time);
if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/ if(HMI_PROTO_CMD_GET == cmd)/*获取数据*/
@@ -359,10 +318,12 @@ static void gui_tjc_hmi_main_send(u8 cmd,u8 opa,u8 *p_data)
if(0x01 == p_data[0]) if(0x01 == p_data[0])
{ {
/*01打开蜂鸣器*/ /*01打开蜂鸣器*/
buzzer.set.enable();
} }
else else
{ {
/*00关闭蜂鸣器*/ /*00关闭蜂鸣器*/
buzzer.set.disable();
} }
} }
default:return; default:return;
@@ -1549,7 +1510,7 @@ static void gui_tjc_hmi_device_config_send(u8 cmd,u8 opa,u8 *p_data)
new_device.state = ENABLE; new_device.state = ENABLE;
leakage.sub_device_data[x].flash_data = new_device; leakage.sub_device_data[x].flash_data = new_device;
gui_tjc_hmi_save_device_info_to_w25q(); gui_tjc_hmi_save_device_info_to_w25q();
app_leakage_region_classify(); gui_tjc_hmi_class_update();
field_count++; field_count++;
} }
} }
@@ -1568,7 +1529,7 @@ static void gui_tjc_hmi_device_config_send(u8 cmd,u8 opa,u8 *p_data)
gui_tjc_hmi_save_device_info_to_w25q(); gui_tjc_hmi_save_device_info_to_w25q();
/*重新分类区域*/ /*重新分类区域*/
app_leakage_region_classify(); gui_tjc_hmi_class_update();
} }
else else
@@ -1654,7 +1615,7 @@ static void gui_tjc_hmi_device_config_send(u8 cmd,u8 opa,u8 *p_data)
gui_tjc_hmi_save_device_info_to_w25q(); gui_tjc_hmi_save_device_info_to_w25q();
/*重新分类区域*/ /*重新分类区域*/
app_leakage_region_classify(); gui_tjc_hmi_class_update();
/*发送确认响应*/ /*发送确认响应*/
} }
@@ -12,6 +12,9 @@
#define BIG_ENDIAN (0)//大端序 #define BIG_ENDIAN (0)//大端序
#define LITTLE_ENDIAN (1)//小端序 #define LITTLE_ENDIAN (1)//小端序
#define MODBUS_TCP_PROTO_TYPE (0x0000)
typedef struct { typedef struct {
u8 send_buffer[MODBUS_SENDBUF_LEN]; u8 send_buffer[MODBUS_SENDBUF_LEN];
u16 len; u16 len;
@@ -114,16 +114,22 @@ static void proto_leakage_tx_curr_data_get(proto_leakage_t *p_leakage)
static void proto_leakage_tx_task(proto_leakage_t *p_leakage) static void proto_leakage_tx_task(proto_leakage_t *p_leakage)
{ {
u16 i;
proto_sensor_class_t *p_sensor; proto_sensor_class_t *p_sensor;
p_sensor = &p_leakage->sensor[p_leakage->sensor_index]; p_sensor = &p_leakage->sensor[p_leakage->sensor_index];
if(0 == p_leakage->sensor_num)/*没有传感器的COM口不发送*/
{
return;
}
if(0 == (p_sensor->comm.sensor_state_code & (0x00000001 << PROTO_LEAKAGE_STATE_CODE_TIME_OUT))) if(0 == (p_sensor->comm.sensor_state_code & (PROTO_LEAKAGE_STATE_CODE_TIME_OUT)))
{ {
if((++p_sensor->comm.tx_time_out_count) > 20)/*500ms轮询 10秒通讯超时*/ if((++p_sensor->comm.tx_time_out_count) > 10)/*连续读取10次 通讯超时*/
{ {
p_sensor->comm.sensor_state_code |= (0x00000001 << PROTO_LEAKAGE_STATE_CODE_TIME_OUT); p_sensor->comm.sensor_state_code |= (PROTO_LEAKAGE_STATE_CODE_TIME_OUT);
/*清除数据*/ /*清除数据*/
//memset(&gas_data[p_sensor->sensor_index],0,sizeof(gas_data_t)); //memset(&gas_data[p_sensor->sensor_index],0,sizeof(gas_data_t));
} }
@@ -131,6 +137,10 @@ static void proto_leakage_tx_task(proto_leakage_t *p_leakage)
switch(p_sensor->comm.state) switch(p_sensor->comm.state)
{ {
case PROTO_LEAKAGE_COMM_STATE_INIT:
{
}break;
case PROTO_LEAKAGE_COMM_STATE_CURR_DATA_GET: case PROTO_LEAKAGE_COMM_STATE_CURR_DATA_GET:
{ {
proto_leakage_tx_curr_data_get(p_leakage); proto_leakage_tx_curr_data_get(p_leakage);
@@ -140,14 +150,34 @@ static void proto_leakage_tx_task(proto_leakage_t *p_leakage)
}break; }break;
} }
/*通讯超时*/
if(p_sensor->comm.sensor_state_code & (PROTO_LEAKAGE_STATE_CODE_TIME_OUT))
{
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_CH_NUM;i++)
{
leakage.sub_device_data[p_sensor->comm.leakage_data_index].ch_data[i].state |= APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT;
}
}
else
{
for(i=0;i<APP_LEAKAGE_SUB_DEVICE_CH_NUM;i++)
{
leakage.sub_device_data[p_sensor->comm.leakage_data_index].ch_data[i].state &= (~APP_LEAKAGE_SUB_DEVICE_STATE_TIME_OUT);
}
}
p_sensor->comm.state_send_time++; p_sensor->comm.state_send_time++;
if(p_sensor->comm.state_send_time >= 3) /*进入异常*/ if(p_sensor->comm.state_send_time >= 3) /*进入异常*/
{ {
p_sensor->comm.sensor_state_code |= (0x00000001 << p_sensor->comm.sensor_state_code);/*记录异常状态*/ p_sensor->comm.sensor_state_code |= (p_sensor->comm.sensor_state_code);/*记录异常状态*/
p_sensor->comm.state_send_time = 0; p_sensor->comm.state_send_time = 0;
p_sensor->comm.sensor_state_code = PROTO_LEAKAGE_COMM_STATE_DEFAULT; p_sensor->comm.state = PROTO_LEAKAGE_COMM_STATE_DEFAULT;
proto_leakage_switch(p_leakage); /*切换设备*/ proto_leakage_switch(p_leakage); /*切换设备*/
} }
} }
static void proto_leakage_rx_task(u8 *p_data,u16 len,void *other_data) static void proto_leakage_rx_task(u8 *p_data,u16 len,void *other_data)
@@ -209,7 +239,7 @@ static void proto_leakage_rx_task(u8 *p_data,u16 len,void *other_data)
p_sensor->comm.tx_time_out_count = 0; p_sensor->comm.tx_time_out_count = 0;
p_sensor->comm.sensor_state_code &= (~(0x00000001 << PROTO_LEAKAGE_STATE_CODE_TIME_OUT)); p_sensor->comm.sensor_state_code &= (~PROTO_LEAKAGE_STATE_CODE_TIME_OUT);
switch(p_sensor->comm.state) switch(p_sensor->comm.state)
{ {
@@ -220,7 +250,7 @@ static void proto_leakage_rx_task(u8 *p_data,u16 len,void *other_data)
case PROTO_LEAKAGE_COMM_STATE_CURR_DATA_GET: case PROTO_LEAKAGE_COMM_STATE_CURR_DATA_GET:
{ {
/*计算当前设备索引*/ /*计算当前设备索引*/
u8 sensor_index = p_leakage->sensor_index; u8 sensor_index = p_sensor->comm.leakage_data_index;
u16 ch_addr_offset[4] = {0,4,8,11}; /*漏液待数据地址偏移*/ u16 ch_addr_offset[4] = {0,4,8,11}; /*漏液待数据地址偏移*/
u16 temp; u16 temp;
@@ -12,7 +12,7 @@
#define PROTO_LEAKAGE_COMM_STATE_DEFAULT PROTO_LEAKAGE_COMM_STATE_CURR_DATA_GET #define PROTO_LEAKAGE_COMM_STATE_DEFAULT PROTO_LEAKAGE_COMM_STATE_CURR_DATA_GET
#define PROTO_LEAKAGE_STATE_CODE_TIME_OUT (30U) /*通讯超时*/ #define PROTO_LEAKAGE_STATE_CODE_TIME_OUT (0x8000) /*通讯超时*/
typedef struct typedef struct
{ {
@@ -1,326 +0,0 @@
/*对外通讯 modbus从机*/
#include "proto_modbus_slave_ex.h"
#include "string.h"
#include "stdio.h"
#include "app.h"
#include "app_timer.h"
#include "bsp_relay.h"
#include "bsp_Uart.h"
#include "bsp_Flash.h"
#include "proto_print.h"
#include "proto_modbus_master_leakage.h"
static modbus_analysis_data_t modbus_analysis_data;//指令解析结构体
static modbus_communication_send_buf_t send_struct;//发送结构体
static void proto_modbus_communication_data_analysis(u8 *pData, u16 len, void *data);
static void proto_modbus_communication_data_send(u8 *pData, u16 len);
static void proto_modbus_init(void);
static void proto_modbus_task(void);
static modbus_error_code_e proto_modbus_data_write(u16 Addr, u16 Value);
static u16 proto_modbus_data_read(u16 Addr);
proto_Modbus_t modbus_slave_ex=
{
.id = 0x01,
.data_read = proto_modbus_data_read,
.data_write = proto_modbus_data_write,
.data_analysis = proto_modbus_communication_data_analysis,
.init = proto_modbus_init,
.task = proto_modbus_task,
};
static proto_Modbus_t *p_modbus = &modbus_slave_ex;
static bsp_uart_t * p_rx_uart;
static void proto_modbus_communication_data_send(u8 *p_data, u16 len)
{
if(p_rx_uart != NULL)
{
p_rx_uart->send(p_rx_uart,p_data,len);
}
}
static void proto_modbus_init(void)
{
p_modbus->id = Usr_Flash.FlashData.modbus_id;
com_uart1.rx_data_analysis = proto_modbus_communication_data_analysis;
com_uart4.rx_data_analysis = proto_modbus_communication_data_analysis;
}
static void proto_modbus_task(void)
{
}
static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *other_data)
{
modbus_error_code_e error_code;
u16 inx;
u16 TempAddr, TempData, crc_16;
if (0 == modbus_lib_analysis(&modbus_analysis_data, pData, len))//检查数据长度 校验是否正确
return;
if (p_modbus->id != modbus_analysis_data.id && modbus_analysis_data.id != 0xe8)//判断ID是否正确
return;
error_code = ModbusErrorCode_Success;
/* //检查地址是否超出范围
if ((modbus_analysis_data.start_addr >= MODBUS_REG_LEN) || (modbus_analysis_data.reg_number >= MODBUS_REG_LEN) ||
(modbus_analysis_data.start_addr + modbus_analysis_data.reg_number >= MODBUS_REG_LEN))
{
ErrorCode = ModbusErrorCode_IllegalAddr;
goto Error;
}
*/
p_rx_uart = (bsp_uart_t*)other_data;
switch (modbus_analysis_data.func)
{
case 0x03:
case 0x04:
{
TempAddr = modbus_analysis_data.start_addr;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func;
send_struct.send_buffer[2] = 2 * modbus_analysis_data.reg_number;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{
TempData = proto_modbus_data_read(TempAddr);
send_struct.send_buffer[3 + 2 * inx] = (TempData >> 8) & 0xff;
send_struct.send_buffer[4 + 2 * inx] = TempData & 0xff;
TempAddr++;
}
crc_16 = modbus_lib_crc16(send_struct.send_buffer, 3 + send_struct.send_buffer[2]);
send_struct.send_buffer[3 + send_struct.send_buffer[2]] = crc_16 & 0xff;
send_struct.send_buffer[4 + send_struct.send_buffer[2]] = (crc_16 >> 8) & 0xff;
send_struct.len = 5 + send_struct.send_buffer[2];
}goto Success;
/*特殊协议*/
case 0x41:
{
TempAddr = modbus_analysis_data.start_addr;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func;
send_struct.send_buffer[2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[4] = (2 * modbus_analysis_data.reg_number) >> 8;
send_struct.send_buffer[5] = (2 * modbus_analysis_data.reg_number) & 0xff;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{
TempData = proto_modbus_data_read(TempAddr);
send_struct.send_buffer[6 + 2 * inx] = (TempData >> 8) & 0xff;
send_struct.send_buffer[7 + 2 * inx] = TempData & 0xff;
TempAddr++;
}
crc_16 = modbus_lib_crc16(send_struct.send_buffer, 6 + 2 * modbus_analysis_data.reg_number);
send_struct.send_buffer[6 + 2 * modbus_analysis_data.reg_number] = crc_16 & 0xff;
send_struct.send_buffer[7 + 2 * modbus_analysis_data.reg_number] = (crc_16 >> 8) & 0xff;
send_struct.len = 8 + 2 * modbus_analysis_data.reg_number;
}goto Success;
case 0x06:
{
TempAddr = modbus_analysis_data.start_addr;
TempData = (modbus_analysis_data.write_data_addr[0] << 8) | modbus_analysis_data.write_data_addr[1];
error_code = proto_modbus_data_write(TempAddr, TempData);
if (error_code)
{
goto Error;
}
send_struct.len = 8;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func;
send_struct.send_buffer[2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[4] = modbus_analysis_data.write_data_addr[0];
send_struct.send_buffer[5] = modbus_analysis_data.write_data_addr[1];
crc_16 = modbus_lib_crc16(send_struct.send_buffer, 6);
send_struct.send_buffer[6] = crc_16 & 0xff;
send_struct.send_buffer[7] = (crc_16 >> 8) & 0xff;
}break;
case 0x10:
{
TempAddr = modbus_analysis_data.start_addr;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{
TempData = modbus_analysis_data.write_data_addr[2 * inx];
TempData = (TempData << 8) | modbus_analysis_data.write_data_addr[2 * inx + 1];
error_code = proto_modbus_data_write(TempAddr, TempData);
TempAddr++;
if (error_code)
{
goto Error;
}
}
send_struct.len = 8;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func;
send_struct.send_buffer[2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[4] = modbus_analysis_data.reg_number >> 8;
send_struct.send_buffer[5] = modbus_analysis_data.reg_number & 0xff;
crc_16 = modbus_lib_crc16(send_struct.send_buffer, 6);
send_struct.send_buffer[6] = crc_16 & 0xff;
send_struct.send_buffer[7] = (crc_16 >> 8) & 0xff;
}
break;
default:
{
error_code = ModbusErrorCode_IllegalFunction;
}
goto Error;
}
Success:
proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len);
return;
Error:
send_struct.len = 5;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func | 0x80;
send_struct.send_buffer[2] = error_code;
crc_16 = modbus_lib_crc16(send_struct.send_buffer, 3);
send_struct.send_buffer[3] = crc_16 & 0xff;
send_struct.send_buffer[4] = (crc_16 >> 8) & 0xff;
proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len);
}
/******************************************
* 函数: proto_modbus_data_write
* 功能: Modbus写寄存器
* 参数: Addr: 地址
Value:数据
* 返回: 无
* 描述: 无
******************************************/
static modbus_error_code_e proto_modbus_data_write(u16 addr, u16 data)
{
modbus_error_code_e error_code;
u8 temp_point,cali_point;
error_code = ModbusErrorCode_Success;
switch(addr)
{
case 1 ... 4:
{
relay.set(addr-1,data);
}break;
/*sn*/
case 20000 ... 20004:
{
Usr_Flash.FlashData.sn[addr - 20000] = data;
Usr_Flash.Write();
}break;
/*modbus_id*/
case 20005:
{
Usr_Flash.FlashData.modbus_id = data;
modbus_slave_ex.id = Usr_Flash.FlashData.modbus_id;
Usr_Flash.Write();
}break;
/*modbus_read_reg_num*/
case 20006:
{
if(data > 1000)
{
error_code = ModbusErrorCode_IllegalData;
}
else
{
Usr_Flash.FlashData.modbus_read_reg_num = data;
Usr_Flash.Write();
}
}break;
case 20007:
{
if(data > 16)
{
error_code = ModbusErrorCode_IllegalData;
}
else
{
Usr_Flash.FlashData.modbus_read_sensor_num = data;
Usr_Flash.Write();
}
}break;
/*FC打印相关数据*/
case 252:
{
print.set(data);
}break;
}
return error_code;
}
/******************************************
* 函数: proto_modbus_data_read
* 功能: Modbus读寄存器数据
* 参数: Addr: 地址
* 返回: 地址对应的数据
* 描述: 无
******************************************/
static u16 proto_modbus_data_read(u16 addr)
{
u16 data = 0;
u16 *p_data;
u16 num,offset;
switch(addr)
{
case 1 ... 4:
{
data = relay.state[addr - 1];
}break;
// /*实时数据*/
// case 0 ... 639:
// {
// u16 size;
// size = sizeof(gas_data_t);
// /* TDLAS默认读取*/
// if( size== (2 * Usr_Flash.FlashData.modbus_read_reg_num))
// {
// p_data = (u16 *)&gas_data;
// data = p_data[addr];
// }
// else if((2 * Usr_Flash.FlashData.modbus_read_reg_num )< sizeof(gas_data_t))/*其他传感器*/
// {
// num = addr / Usr_Flash.FlashData.modbus_read_reg_num;
// offset = addr % Usr_Flash.FlashData.modbus_read_reg_num;
// p_data = (u16 *)&gas_data[num];
// data = p_data[offset];
// }
//
// }break;
//
// /*sn*/
// case 20000 ... 20004:
// {
// data = Usr_Flash.FlashData.sn[addr - 20000];
// }break;
// /*modbus_id*/
// case 20005:
// {
// data = Usr_Flash.FlashData.modbus_id;
// }break;
// /*modbus_read_reg_num*/
// case 20006:
// {
// data = Usr_Flash.FlashData.modbus_read_reg_num;
// }break;
// case 20007:
// {
// data = Usr_Flash.FlashData.modbus_read_sensor_num;
// }break;
default:data = 0;
}
return data;
}
@@ -0,0 +1,299 @@
/*对外通讯 modbus从机*/
#include "proto_modbus_tcp_slave_ex.h"
#include "string.h"
#include "stdio.h"
#include "app.h"
#include "app_timer.h"
#include "app_leakage.h"
#include "bsp_relay.h"
#include "bsp_Uart.h"
#include "bsp_Flash.h"
#include "bsp_W5500.h"
#include "proto_print.h"
#include "proto_modbus_master_leakage.h"
static modbus_analysis_data_t modbus_analysis_data;//指令解析结构体
static modbus_communication_send_buf_t send_struct;//发送结构体
static void proto_modbus_communication_data_analysis(u8 *pData, u16 len, void *data);
static void proto_modbus_communication_data_send(u8 *pData, u16 len);
static void proto_modbus_init(void);
static void proto_modbus_task(void);
static modbus_error_code_e proto_modbus_data_write(u16 Addr, u16 Value);
static u16 proto_modbus_data_read(u16 Addr);
proto_Modbus_t modbus_slave_ex=
{
.id = 0x01,
.data_read = proto_modbus_data_read,
.data_write = proto_modbus_data_write,
.data_analysis = proto_modbus_communication_data_analysis,
.init = proto_modbus_init,
.task = proto_modbus_task,
};
static proto_Modbus_t *p_modbus = &modbus_slave_ex;
bsp_W5500_Class_t *p_W5500_Class = NULL;
static void proto_modbus_communication_data_send(u8 *p_data, u16 len)
{
if(NULL != p_W5500_Class)
{
W5500.Socket_Send(p_W5500_Class,p_data,len);
}
}
static void proto_modbus_init(void)
{
W5500.W5500_Class[0].Rx_DataAnalysis = proto_modbus_communication_data_analysis;
}
static void proto_modbus_task(void)
{
}
static void proto_modbus_communication_data_analysis(u8 *pData, u16 len,void *other_data)
{
modbus_error_code_e error_code;
u16 inx;
u16 TempAddr, TempData, crc_16;
u16 send_buff_index_offset = 0;
u16 transaction_type,proto_type,proto_len;
/*mobuds_tcp校验*/
transaction_type = pData[0] << 8 | pData[1]; /*事务类型*/
proto_type = pData[2] << 8 | pData[3]; /*协议类型*/
proto_len = pData[4] << 8 | pData[5]; /*协议长度*/
/*协议类型 长度判断*/
if(MODBUS_TCP_PROTO_TYPE != proto_type || proto_len != (len - 6))
{
return;
}
p_W5500_Class = (bsp_W5500_Class_t *)other_data;
/*正常modbus协议解析*/
modbus_analysis_data.id = pData[6];
modbus_analysis_data.func = pData[7];
modbus_analysis_data.start_addr = pData[8] << 8 | pData[9];
modbus_analysis_data.reg_number = pData[10] << 8 | pData[11];
send_buff_index_offset = 6;
memcpy(send_struct.send_buffer,pData,send_buff_index_offset);
error_code = ModbusErrorCode_Success;
/* //检查地址是否超出范围
if ((modbus_analysis_data.start_addr >= MODBUS_REG_LEN) || (modbus_analysis_data.reg_number >= MODBUS_REG_LEN) ||
(modbus_analysis_data.start_addr + modbus_analysis_data.reg_number >= MODBUS_REG_LEN))
{
ErrorCode = ModbusErrorCode_IllegalAddr;
goto Error;
}
*/
switch (modbus_analysis_data.func)
{
case 0x03:
case 0x04:
{
TempAddr = modbus_analysis_data.start_addr;
send_struct.send_buffer[send_buff_index_offset + 0] = modbus_analysis_data.id;
send_struct.send_buffer[send_buff_index_offset + 1] = modbus_analysis_data.func;
send_struct.send_buffer[send_buff_index_offset + 2] = 2 * modbus_analysis_data.reg_number;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{
TempData = proto_modbus_data_read(TempAddr);
send_struct.send_buffer[send_buff_index_offset + 3 + 2 * inx] = (TempData >> 8) & 0xff;
send_struct.send_buffer[send_buff_index_offset + 4 + 2 * inx] = TempData & 0xff;
TempAddr++;
}
send_struct.len =send_buff_index_offset + 3 + send_struct.send_buffer[send_buff_index_offset + 2];
}goto Success;
/*特殊协议*/
case 0x41:
{
TempAddr = modbus_analysis_data.start_addr;
send_struct.send_buffer[send_buff_index_offset + 0] = modbus_analysis_data.id;
send_struct.send_buffer[send_buff_index_offset + 1] = modbus_analysis_data.func;
send_struct.send_buffer[send_buff_index_offset + 2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[send_buff_index_offset + 3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[send_buff_index_offset + 4] = (2 * modbus_analysis_data.reg_number) >> 8;
send_struct.send_buffer[send_buff_index_offset + 5] = (2 * modbus_analysis_data.reg_number) & 0xff;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{
TempData = proto_modbus_data_read(TempAddr);
send_struct.send_buffer[send_buff_index_offset + 6 + 2 * inx] = (TempData >> 8) & 0xff;
send_struct.send_buffer[send_buff_index_offset + 7 + 2 * inx] = TempData & 0xff;
TempAddr++;
}
send_struct.len = send_buff_index_offset + 6 + 2 * modbus_analysis_data.reg_number;
}goto Success;
case 0x06:
{
TempAddr = modbus_analysis_data.start_addr;
TempData = (modbus_analysis_data.write_data_addr[0] << 8) | modbus_analysis_data.write_data_addr[1];
error_code = proto_modbus_data_write(TempAddr, TempData);
if (error_code)
{
goto Error;
}
send_struct.len = send_buff_index_offset + 6;
send_struct.send_buffer[send_buff_index_offset + 0] = modbus_analysis_data.id;
send_struct.send_buffer[send_buff_index_offset + 1] = modbus_analysis_data.func;
send_struct.send_buffer[send_buff_index_offset + 2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[send_buff_index_offset + 3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[send_buff_index_offset + 4] = modbus_analysis_data.write_data_addr[0];
send_struct.send_buffer[send_buff_index_offset + 5] = modbus_analysis_data.write_data_addr[1];
}break;
case 0x10:
{
TempAddr = modbus_analysis_data.start_addr;
for (inx = 0; inx < modbus_analysis_data.reg_number; inx++)
{
TempData = modbus_analysis_data.write_data_addr[2 * inx];
TempData = (TempData << 8) | modbus_analysis_data.write_data_addr[2 * inx + 1];
error_code = proto_modbus_data_write(TempAddr, TempData);
TempAddr++;
if (error_code)
{
goto Error;
}
}
send_struct.len = send_buff_index_offset + 6;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func;
send_struct.send_buffer[2] = modbus_analysis_data.start_addr >> 8;
send_struct.send_buffer[3] = modbus_analysis_data.start_addr & 0xff;
send_struct.send_buffer[4] = modbus_analysis_data.reg_number >> 8;
send_struct.send_buffer[5] = modbus_analysis_data.reg_number & 0xff;
}
break;
default:
{
error_code = ModbusErrorCode_IllegalFunction;
}
goto Error;
}
Success:
send_struct.send_buffer[4] = (send_struct.len - send_buff_index_offset) >> 8;
send_struct.send_buffer[5] = (send_struct.len - send_buff_index_offset) & 0x00ff;
proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len);
return;
Error:
send_struct.len = send_buff_index_offset + 3;
send_struct.send_buffer[0] = modbus_analysis_data.id;
send_struct.send_buffer[1] = modbus_analysis_data.func | 0x80;
send_struct.send_buffer[2] = error_code;
send_struct.send_buffer[4] = (send_struct.len - send_buff_index_offset) >> 8;
send_struct.send_buffer[5] = (send_struct.len - send_buff_index_offset) & 0x00ff;
proto_modbus_communication_data_send(send_struct.send_buffer, send_struct.len);
}
/******************************************
* 函数: proto_modbus_data_write
* 功能: Modbus写寄存器
* 参数: Addr: 地址
Value:数据
* 返回: 无
* 描述: 无
******************************************/
static modbus_error_code_e proto_modbus_data_write(u16 addr, u16 data)
{
modbus_error_code_e error_code;
u8 temp_point,cali_point;
error_code = ModbusErrorCode_Success;
switch(addr)
{
// case 1 ... 4:
// {
// relay.set(addr-1,data);
// }break;
//
// /*sn*/
// case 20000 ... 20004:
// {
// Usr_Flash.FlashData.sn[addr - 20000] = data;
// Usr_Flash.Write();
// }break;
// /*modbus_id*/
// case 20005:
// {
// Usr_Flash.FlashData.modbus_id = data;
// modbus_slave_ex.id = Usr_Flash.FlashData.modbus_id;
// Usr_Flash.Write();
// }break;
}
return error_code;
}
/******************************************
* 函数: proto_modbus_data_read
* 功能: Modbus读寄存器数据
* 参数: Addr: 地址
* 返回: 地址对应的数据
* 描述: 无
******************************************/
static u16 proto_modbus_data_read(u16 addr)
{
u16 data = 0;
u16 *p_data;
u16 num,offset;
u16 sensor_index,sensor_ch,reg;
u16 *p_string;
switch(addr)
{
case 0 ... 607:
{
sensor_index = addr / 19; /*哪一个传光强*/
reg = addr % 19; /*哪一个数据*/
switch(reg)
{
case 0:/*端口&ID*/
{
data = (leakage.sub_device_data[sensor_index].flash_data.com + 1)<< 8 | leakage.sub_device_data[sensor_index].flash_data.modbus_id;
}break;
case 1 ... 5:/*区域名*/
{
p_string = (u16 *)leakage.sub_device_data[sensor_index].flash_data.region_name;
data = p_string[reg - 1]>> 8 | p_string[reg - 1] << 8;
}break;
case 6 ... 10:/*设备名*/
{
p_string = (u16 *)leakage.sub_device_data[sensor_index].flash_data.device_name;
data = p_string[reg - 6]>> 8 | p_string[reg - 6] << 8;
}break;
case 11 ... 18:/*通道数据*/
{
sensor_ch = (addr - 11) / 2;
if( (addr - 11) & 0x0001) /*漏液位置*/
{
data = leakage.sub_device_data[sensor_index].ch_data[sensor_ch].distance;
}
else /*设备状态*/
{
data = leakage.sub_device_data[sensor_index].ch_data[sensor_ch].state;
}
}break;
default:data = 0;
}
}break;
default:data = 0;
}
return data;
}
@@ -1,5 +1,5 @@
#ifndef _PROTO_MODBUS_SLAVE_EX_H_ #ifndef _PROTO_MODBUS_TCP_SLAVE_EX_H_
#define _PROTO_MODBUS_SLAVE_EX_H_ #define _PROTO_MODBUS_TCP_SLAVE_EX_H_
#include "main.h" #include "main.h"
#include "gas_data.h" #include "gas_data.h"
#include "proto_modbus_lib.h" #include "proto_modbus_lib.h"