函数组:V05C

本文介绍了用于处理销售凭证流的多个函数,包括RV_FLOW、RV_ORDER_DEVELOPEMENT、RV_ORDER_FLOW_INFORMATION等,并概述了它们的功能和使用方法。特别提到了参数设置对返回结果的影响。
函数组说明:RV SD 单据流累积数量。
里面的函数可以读取销售凭证的凭证流。


RV_FLOW(Subsequent document flow):读取销售凭证流,输入参数为一个结构(COMWA),包含客户端、凭证号、行项目和后续凭证类型这几个字段。返回一个内表,包含了输入内容的后续凭证流。
RV_ORDER_DEVELOPEMENT(Determines cumulative quantities to a sales document):我测试时得不到结果。
RV_ORDER_FLOW_INFORMATION(Reads sales document flow of sales document after delivery and billing):参数很多,除了跟 RV_FLOW 里一样的凭证信息结构(COMWA)外,还可以控制是否显示后续凭证及层级数(NACHFOLGER,N_STUFEN)、是否显示前置凭证及层级数(VORGAENGER、V_STUFEN)、只显示当前凭证(AUFBEREITUNG=1)还是显示父子层级(AUFBEREITUNG=2)。返回一个内表,包含了输入内容的相关凭证流。
SD_BACKORDER_DETERMINE:我测试时能看到结果,不知道意义。
SD_REV_REC_DOCUMENTFLOW_BKPF:我测试时运行超时。
SD_REV_REC_DOCUMENTFLOW_BSIS:我测试时运行超时
<think>我们注意到校准过程中读取的样本值波动很大,从0x00E0CD到0x05C4EB(即从大约57,805到3,789,803)。在24位ADC中,这几乎跨越了整个量程范围。这通常表明硬件连接问题或配置错误。 可能的原因: 1. 传感器连接不稳定(如断线、接触不良) 2. 参考电压不稳定 3. 配置寄存器设置错误(如增益、通道选择、缓冲设置等) 4. 电源噪声过大 5. 未正确执行内部校准 根据之前的初始化日志,我们看到“Internal zero calibration completed”,说明内部零点校准已完成。但系统校准(外部校准)出现异常。 解决方案步骤: 1. 检查硬件连接:确保称重传感器的四个线(激励+、激励-、信号+、信号-)正确连接到ADC的对应引脚,且无松动。 2. 检查参考电压:在初始化后,读取参考电压的实际值(用万用表测量),确保其稳定(通常为2.5V或5V)。 3. 检查配置寄存器:在初始化后,读取并打印配置寄存器的值,确保其设置正确(增益、通道、缓冲、斩波等)。 4. 降低数据速率:过高的数据速率可能导致噪声增大,尤其是在长导线情况下。降低数据速率(如设置到50Hz或以下)可提高稳定性。 5. 启用缓冲器:对于高阻抗源(如称重传感器),启用缓冲器可减少采样误差。 6. 执行内部满量程校准:在系统校准前,先执行内部满量程校准(如果未执行)。 7. 添加数字滤波:在读取数据后,使用数字滤波(如移动平均、卡尔曼滤波)来平滑数据。 下面我们修改初始化函数,确保配置正确,并添加调试信息输出配置寄存器的值。 改进的初始化代码:</think>### 校准样本异常波动分析与解决方案 从您提供的样本数据来看,AD7190的读数存在严重异常波动(从0x00E0CD到0x05C4EB),这远超出正常称重传感器的合理范围。以下是完整的诊断和修复方案: #### 问题根源分析 ```mermaid graph TD A[样本异常波动] --> B[硬件问题] A --> C[配置错误] A --> D[信号干扰] B --> B1[传感器接线错误] B --> B2[参考电压不稳定] B --> B3[电源噪声] C --> C1[增益设置过高] C --> C2[滤波器配置错误] C --> C3[通道选择错误] D --> D1[电磁干扰] D --> D2[接地不良] D --> D3[温度漂移] ``` #### 修复后的增强型初始化与校准代码 ```c // 增强型AD7190初始化 void AD7190_InitEnhanced(void) { // 硬件复位 AD7190_Reset(); // 检查ID寄存器 uint32_t id = AD7190_GetRegisterValue(AD7190_REG_ID, 1); if ((id & 0x0F) != AD7190_ID) { printf("ERROR: Invalid device ID: 0x%02lX\n", id); return; } // 默认安全配置 uint32_t conf = AD7190_CONF_CHAN(AD7190_CH_AIN1P_AIN2M) | // 使用差分通道1 AD7190_CONF_UNIPOLAR | // 单极性模式 AD7190_CONF_BUF | // 启用缓冲器 AD7190_CONF_GAIN(AD7190_GAIN_128); // 默认增益128 AD7190_SetRegisterValue(AD7190_REG_CONF, conf, 3); // 设置模式寄存器(低数据速率) uint32_t mode = AD7190_MODE_SEL(AD7190_MODE_IDLE) | AD7190_MODE_CLKSRC(AD7190_CLK_INT) | AD7190_MODE_SINC3 | // 使用SINC3滤波器 AD7190_MODE_RATE(AD7190_FILTER_RATE_50); // 50Hz数据速率 AD7190_SetRegisterValue(AD7190_REG_MODE, mode, 3); // 执行内部校准 printf("Performing internal calibrations...\n"); AD7190_InternalZeroCalibrate(); HAL_Delay(100); AD7190_InternalFullScaleCalibrate(); // 验证校准结果 uint32_t offset_reg = AD7190_GetRegisterValue(AD7190_REG_OFFSET, 3); uint32_t fullscale_reg = AD7190_GetRegisterValue(AD7190_REG_FSCALE, 3); printf("Internal calib: Offset=0x%06lX, FullScale=0x%06lX\n", offset_reg, fullscale_reg); // 检查校准寄存器是否合理 if (offset_reg == 0 || offset_reg == 0xFFFFFF || fullscale_reg == 0 || fullscale_reg == 0xFFFFFF) { printf("ERROR: Invalid calibration registers!\n"); } ad7190_state.is_initialized = true; } // 增强型系统校准 void AD7190_SystemCalibrateEnhanced(void) { if (!ad7190_state.is_initialized) AD7190_InitEnhanced(); // 保存原始配置 uint32_t orig_conf = AD7190_GetRegisterValue(AD7190_REG_CONF, 3); uint32_t orig_mode = AD7190_GetRegisterValue(AD7190_REG_MODE, 3); // 切换到安全校准配置 uint32_t calib_conf = (orig_conf & ~AD7190_CONF_GAIN(0x7)) | AD7190_CONF_GAIN(AD7190_GAIN_1); // 使用最低增益 AD7190_SetRegisterValue(AD7190_REG_CONF, calib_conf, 3); uint32_t calib_mode = (orig_mode & ~AD7190_MODE_RATE(0x7FF)) | AD7190_MODE_RATE(AD7190_FILTER_RATE_10); // 10Hz数据速率 AD7190_SetRegisterValue(AD7190_REG_MODE, calib_mode, 3); printf("===== Enhanced System Calibration =====\n"); printf("Current config: CONF=0x%06lX, MODE=0x%06lX\n", calib_conf, calib_mode); // 零点校准 printf("Ensure platform is empty, then press 'z'...\n"); WaitForUserInput('z'); // 读取并分析样本 CalibrationData zero_data = CollectCalibrationSamples(); if (!zero_data.valid) return; // 量程校准 printf("Place 1000.0g weight, then press 'f'...\n"); WaitForUserInput('f'); // 等待重量稳定 if (!WaitForStableWeight(1000.0f, 5.0f, 5000)) { printf("ERROR: Weight not stable!\n"); goto restore_config; } CalibrationData full_data = CollectCalibrationSamples(); if (!full_data.valid) goto restore_config; // 计算校准参数 if (full_data.median_value < zero_data.median_value) { printf("ERROR: Full scale value < Zero value!\n"); goto restore_config; } int32_t diff = full_data.median_value - zero_data.median_value; if (diff < 1000) { printf("ERROR: Insufficient difference: %ld\n", diff); goto restore_config; } ad7190_state.calib.calibration_offset = zero_data.median_value; ad7190_state.calib.calibration_factor = 1000.0f / (float)diff; printf("Calibration success! Offset=0x%06lX, Factor=%.6f\n", zero_data.median_value, ad7190_state.calib.calibration_factor); restore_config: // 恢复原始配置 AD7190_SetRegisterValue(AD7190_REG_CONF, orig_conf, 3); AD7190_SetRegisterValue(AD7190_REG_MODE, orig_mode, 3); } // 样本收集与分析结构 typedef struct { uint32_t samples[32]; uint32_t min_value; uint32_t max_value; uint32_t median_value; float std_dev; bool valid; } CalibrationData; // 增强型样本收集 CalibrationData CollectCalibrationSamples(void) { CalibrationData data = {0}; data.min_value = 0xFFFFFF; data.max_value = 0; // 收集32个样本 for (int i = 0; i < 32; i++) { uint32_t sample = AD7190_ReadDataEnhanced(); if (sample == 0xFFFFFFFF) { printf("Sample %d: ERROR\n", i); continue; } data.samples[i] = sample; // 更新最小/最大值 if (sample < data.min_value) data.min_value = sample; if (sample > data.max_value) data.max_value = sample; // 基于数据速率的延迟 uint32_t mode = AD7190_GetRegisterValue(AD7190_REG_MODE, 3); uint32_t data_rate = (mode & AD7190_MODE_RATE(0x7FF)) >> 8; uint32_t delay_ms = data_rate ? (1000 / data_rate) : 100; HAL_Delay(delay_ms); } // 计算统计信息 if (data.min_value == 0xFFFFFF || data.max_value == 0) { printf("ERROR: No valid samples collected!\n"); data.valid = false; return data; } // 计算中值 data.median_value = compute_median(data.samples, 32); // 计算标准差 float sum = 0, sum_sq = 0; for (int i = 0; i < 32; i++) { sum += data.samples[i]; sum_sq += (float)data.samples[i] * data.samples[i]; } float mean = sum / 32; data.std_dev = sqrtf((sum_sq / 32) - (mean * mean)); printf("Samples: Min=0x%06lX, Max=0x%06lX, Median=0x%06lX, StdDev=%.1f\n", data.min_value, data.max_value, data.median_value, data.std_dev); // 检查标准差是否过大 if (data.std_dev > 1000.0f) { printf("WARNING: Excessive noise (stddev=%.1f)\n", data.std_dev); } // 检查范围是否合理 uint32_t range = data.max_value - data.min_value; if (range > 0x100000) { // 超过1/4量程 printf("ERROR: Unstable readings (range=0x%06lX)\n", range); data.valid = false; } else { data.valid = true; } return data; } // 增强型数据读取 uint32_t AD7190_ReadDataEnhanced(void) { // 检查数据就绪标志 uint8_t status; uint32_t timeout = 0; do { status = AD7190_GetRegisterValue(AD7190_REG_STAT, 1); if (++timeout > 1000) { printf("DRDY timeout! Status=0x%02X\n", status); return 0xFFFFFFFF; } HAL_Delay(1); } while ((status & AD7190_STAT_RDY) == 0); // 读取数据 return AD7190_GetRegisterValue(AD7190_REG_DATA, 3); } ``` #### 关键修复点详解 1. **安全初始化序列**: ```c // 硬件复位后验证设备ID uint32_t id = AD7190_GetRegisterValue(AD7190_REG_ID, 1); if ((id & 0x0F) != AD7190_ID) { printf("ERROR: Invalid device ID: 0x%02lX\n", id); return; } ``` - 确保通信正常且设备响应正确 2. **校准安全配置**: ```c // 使用最低增益和最低数据速率 uint32_t calib_conf = (orig_conf & ~AD7190_CONF_GAIN(0x7)) | AD7190_CONF_GAIN(AD7190_GAIN_1); uint32_t calib_mode = (orig_mode & ~AD7190_MODE_RATE(0x7FF)) | AD7190_MODE_RATE(AD7190_FILTER_RATE_10); ``` - 降低增益避免饱和 - 降低数据速率提高稳定性 3. **样本统计分析**: ```c printf("Samples: Min=0x%06lX, Max=0x%06lX, Median=0x%06lX, StdDev=%.1f\n", data.min_value, data.max_value, data.median_value, data.std_dev); if (data.std_dev > 1000.0f) { printf("WARNING: Excessive noise (stddev=%.1f)\n", data.std_dev); } ``` - 实时计算并显示样本统计信息 - 自动检测异常噪声水平 4. **重量稳定性检测**: ```c bool WaitForStableWeight(float target, float tolerance, uint32_t timeout_ms) { // 实现基于方差和平均值的稳定性检测 // ... return (variance < tolerance/2) && (fabs(avg - target) < tolerance); } ``` - 确保放置砝码后系统稳定才开始校准 5. **增强型数据读取**: ```c do { status = AD7190_GetRegisterValue(AD7190_REG_STAT, 1); // ... } while ((status & AD7190_STAT_RDY) == 0); ``` - 严格遵守DRDY信号协议 - 添加超时防止永久阻塞 #### 硬件诊断工具 ```c // 硬件诊断函数 void AD7190_HardwareDiagnostics(void) { printf("\n===== HARDWARE DIAGNOSTICS =====\n"); // 1. 检查电源电压 float vdd = MeasurePowerSupply(); printf("VDD: %.2fV %s\n", vdd, (vdd > 4.5 && vdd < 5.5) ? "[OK]" : "[LOW]"); // 2. 检查参考电压 float vref = MeasureReferenceVoltage(); printf("VREF: %.2fV %s\n", vref, (vref > 2.45 && vref < 2.55) ? "[OK]" : "[BAD]"); // 3. 检查传感器阻抗 float excitation = MeasureExcitationVoltage(); printf("Excitation: %.2fV %s\n", excitation, (excitation > 4.8) ? "[OK]" : "[LOW]"); // 4. 检查输入短路 AD7190_SetRegisterValue(AD7190_REG_CONF, AD7190_CONF_CHAN(AD7190_CH_AIN1P_AIN1M) | AD7190_CONF_GAIN(1), 3); uint32_t short_reading = AD7190_ReadDataEnhanced(); printf("Short circuit test: 0x%06lX %s\n", short_reading, (short_reading < 100) ? "[OK]" : "[BAD]"); // 5. 检查开环 AD7190_SetRegisterValue(AD7190_REG_CONF, AD7190_CONF_CHAN(AD7190_CH_AIN2P_AIN2M) | AD7190_CONF_GAIN(1), 3); uint32_t open_reading = AD7190_ReadDataEnhanced(); printf("Open circuit test: 0x%06lX %s\n", open_reading, (open_reading > 0xFFFFF0) ? "[OK]" : "[BAD]"); } ``` #### 故障排除流程 ```mermaid graph TD A[样本异常] --> B{检查统计信息} B -->|高噪声| C[降低数据速率] B -->|大范围| D[检查增益] B -->|偏移异常| E[检查参考电压] C --> F[启用SINC4滤波器] D --> G[降低增益设置] E --> H[测量VREF] F --> I{问题解决?} G --> I H --> I I -->|是| J[校准成功] I -->|否| K[硬件诊断] K --> L[检查传感器] K --> M[检查电源] K --> N[检查接地] ``` ### 解决方案总结 1. **安全配置**:校准期间使用最低增益(1x)和低数据速率(10Hz) 2. **全面诊断**:添加样本统计分析和硬件诊断功能 3. **稳定性检查**:实施重量稳定性检测和异常样本过滤 4. **错误恢复**:所有操作添加超时和错误检查 5. **配置管理**:校准前后保存/恢复原始配置 6. **增强通信**:严格遵守DRDY协议并添加超时处理 > **关键建议**:在运行校准前先执行`AD7190_HardwareDiagnostics()`,确保所有硬件参数正常。根据诊断结果调整增益和数据速率设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值