工具/软件:
我的 EDS 文件和 CODESYS 存在问题。 请检查我的 Ethernet/IP 程序是否正常。
谢谢、
Thien Tran
//********************************************************************************************
//文件:app8AI.c
//说明:8 个模拟输入(内部 ADC)、每个可选择 0–5V 或 4–20mA
//与通过 CIP 类 0x70、实例 0x01 访问 EtherNet/IP 属性兼容。
//********************************************************************************************
#include “app8AI.h"</s>“
#include
#include
#include
#include “ti_drivers_config.h"</s>“
#include “ti_drivers_open_close.h"</s>“
#include “EI_API.h"</s>“
//用于原始 ADC 结果的内部缓冲区
静态 uint16_t GEI_APP_8AI_RESUL[EI_APP_8AI_NUM_channels]={0};
//每通道模式:0 =电压 (0V–5V)、1 =电流 (4–20mA)
静态 uint8_t GEI_APP_8AI_MODE[EI_APP_8AI_NUM_channels]={0};
void EI_APP_8AI_setChannelMode(uint8_t 索引、uint8_t 模式)
{
IF(索引< EI_APP_8AI_NUM_CHANNES)
{
GEI_APP_8AI_MODE[index]=(模式!= 0)? 1:0;
}
}
void EI_APP_8AI_init (void)
{
uint32_t baseAddr = CONFIG_ADC0_BASE_ADDR;
adcStepConfig_t adcConfig;
uint32_t chCnt、adcStep;
int32_t configStatus;
ADCPowerUp (baseAddr、true);
ClockP_USleep (5U);
ADCInit (baseAddr、false、0U、0U);
adcConfig.mode = ADC_OPERATING_MODE_Single_Shot;
adcConfig.openDelay = 0x1U;
adcConfig.sampleDelay = 0U;
adcConfig.rangeCheckEnable = 0U;
adcConfig.AVERAGE = ADC_AVERAING_16_SAMPLES;
adcConfig.fifoNum = ADC_FIFO_NUM_0;
对于 (chCnt = 0u;chCnt < EI_APP_8AI_NUM_channels;chCnt++)
{
adcConfig.channel = ADC_CHANNEL_1 + chCnt;
adcStep = ADC_STEP_1 + chCnt;
configStatus = ADCSetStepParams (baseAddr、adcStep、&adcConfig);
DebugP_assert (SystemP_Success == configStatus);
ADCStepEnable (baseAddr、adcStep、true);
}
ADCStepIdTagEnable (baseAddr、true);
configStatus = ADCSetCPUFIFOThresholdLevel (baseAddr、ADC_FIFO_NUM_0、40U);
DebugP_assert (SystemP_Success == configStatus);
}
void EI_APP_8AI_readInputs (void)
{
uint32_t baseAddr = CONFIG_ADC0_BASE_ADDR;
uint32_t fifoData、fifoWordCnt、stepID;
ADCStart (baseAddr、true);
ClockP_USleep (200);
fifoWordCnt = ADCGetFIFOWordCount (baseAddr、ADC_FIFO_NUM_0);
对于 (uint32_t i = 0u;i < fifoWordCnt;i++)
{
fifoData = ADCGetFIFOData (baseAddr、ADC_FIFO_NUM_0);
StepID =(fifoData & ADC_FIFODATA_ADCCHNLID_MASK)>> ADC_FIFODATA_ADCCHNLID_SHIFT;
fifoData =(fifoData & ADC_FIFODATA_ADCDATA_MASK)>> ADC_FIFODATA_ADCDATA_SHIFT;
IF (stepID < EI_APP_8AI_NUM_channels)
{
GEI_APP_8AI_RESULTs[stepID]= fifoData;
}
}
ADCStart (baseAddr、false);
}
uint16_t EI_APP_8AI_convertTo_mV (uint16_t raw)
{
返回(原始* EI_APP_8AI_REF_VOLTAGE_MV)/ 4095U;
}
uint16_t EI_APP_8AI_convertTo_uA (uint16_t raw)
{
uint16_t mV = EI_APP_8AI_convertTo_mV (raw);
返回 (mV * 1000U)/ 250U;// 250 Ω 分流电阻器
}
uint16_t EI_APP_8AI_getValue (uint8_t channelIndex)
{
IF (channelIndex < EI_APP_8AI_NUM_channels)
返回 GEI_APP_8AI_Results[channelIndex];
返回 0;
}
uint16_t EI_APP_8AI_getEngineeringUnits (uint8_t channelIndex)
{
IF (channelIndex >= EI_APP_8AI_NUM_channels)
返回 0;
Uint16_t RAW = GEI_APP_8AI_RESULTS [channelIndex];
IF (GEI_APP_8AI_MODE[channelIndex]= 0)
返回 EI_APP_8AI_convertTo_mV (raw);//返回 mV
暴露
返回 EI_APP_8AI_convertTo_uA (RAW);//返回 uA
}
void EI_APP_8AI_deInit (void)
{
uint32_t baseAddr = CONFIG_ADC0_BASE_ADDR;
对于 (uint32_t chCnt = 0u;chCnt < EI_APP_8AI_NUM_channels;chCnt++)
{
ADCStepEnable (baseAddr、ADC_STEP_1 + chCnt、false);
}
ADCStart (baseAddr、false);
ADCPowerUp (baseAddr、false);
}
//----------------------------------------------------------------------------------------------------
// Ethernet/IP 属性更新函数
//----------------------------------------------------------------------------------------------------
void EI_APP_8AI_updateCIPATtributes (EI_API_CIP_NODE_T *pCipNode)
{
EI_APP_8AI_readInputs();
对于 (uint16_t i = 0;I < EI_APP_8AI_NUM_channels;I++)
{
uint16_t eng = EI_APP_8AI_getEngineeringUnits (i);
uint8_t scaled = eng >> 4;//缩放以适应 0–255 范围 (USINT)
//使用属性 ID 范围 0x0310–0x0317
EI_API_CIP_setattr_USINT(pCipNode、0x70、0x01、0x0310 + I,缩放);
}
}