better Electronic Throttle body control #493

two ETBs
This commit is contained in:
rusefi 2019-03-10 12:02:25 -04:00
parent 22910b819d
commit 9e46bbf519
9 changed files with 134 additions and 80 deletions

View File

@ -279,9 +279,9 @@ void setEtbTestConfiguration(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
/**
* remember that some H-bridges require 5v control lines, not just 3v logic outputs we have on stm32
*/
CONFIGB(etbDirectionPin1) = GPIOC_7;
CONFIGB(etbDirectionPin2) = GPIOC_9;
CONFIGB(etbControlPin1) = GPIOE_14;
CONFIGB(etb1.directionPin1) = GPIOC_7;
CONFIGB(etb1.directionPin2) = GPIOC_9;
CONFIGB(etb1.controlPin1) = GPIOE_14;
#if EFI_PROD_CODE || defined(__DOXYGEN__)
setDefaultEtbParameters(PASS_ENGINE_PARAMETER_SIGNATURE);

View File

@ -360,10 +360,10 @@ void prepareVoidConfiguration(engine_configuration_s *engineConfiguration) {
boardConfiguration->idle.solenoidPinMode = OM_DEFAULT;
boardConfiguration->fuelPumpPin = GPIO_UNASSIGNED;
boardConfiguration->fuelPumpPinMode = OM_DEFAULT;
boardConfiguration->etbControlPin1 = GPIO_UNASSIGNED;
boardConfiguration->etbControlPin2 = GPIO_UNASSIGNED;
boardConfiguration->etbDirectionPin1 = GPIO_UNASSIGNED;
boardConfiguration->etbDirectionPin2 = GPIO_UNASSIGNED;
boardConfiguration->etb1.controlPin1 = GPIO_UNASSIGNED;
boardConfiguration->etb1.controlPin2 = GPIO_UNASSIGNED;
boardConfiguration->etb1.directionPin1 = GPIO_UNASSIGNED;
boardConfiguration->etb1.directionPin2 = GPIO_UNASSIGNED;
boardConfiguration->o2heaterPin = GPIO_UNASSIGNED;
boardConfiguration->tachOutputPin = GPIO_UNASSIGNED;

View File

@ -1,4 +1,4 @@
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sat Mar 09 23:22:39 EST 2019
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Mar 10 11:52:06 EDT 2019
// begin
#ifndef ENGINE_CONFIGURATION_GENERATED_H_
#define ENGINE_CONFIGURATION_GENERATED_H_
@ -367,6 +367,27 @@ typedef struct {
/** total size 8*/
} idle_hardware_s;
// start of etb_io
typedef struct {
/**
* offset 0
*/
brain_pin_e directionPin1;
/**
* offset 1
*/
brain_pin_e directionPin2;
/**
* offset 2
*/
brain_pin_e controlPin1;
/**
* offset 3
*/
brain_pin_e controlPin2;
/** total size 4*/
} etb_io;
// start of board_configuration_s
typedef struct {
/**
@ -508,19 +529,7 @@ typedef struct {
/**
* offset 80
*/
brain_pin_e etbDirectionPin1;
/**
* offset 81
*/
brain_pin_e etbDirectionPin2;
/**
* offset 82
*/
brain_pin_e etbControlPin1;
/**
* offset 83
*/
brain_pin_e etbControlPin2;
etb_io etb1;
/**
* offset 84
*/
@ -1264,9 +1273,10 @@ typedef struct {
*/
adc_channel_e fuelLevelSensor;
/**
* Second throttle body position sensor
* offset 515
*/
uint8_t unusedtps;
adc_channel_e tps2AdcChannel;
/**
* offset 516
*/
@ -2315,7 +2325,11 @@ typedef struct {
/**
* offset 3988
*/
int mainUnusedEnd[623];
etb_io etb2;
/**
* offset 3992
*/
int mainUnusedEnd[622];
/** total size 6480*/
} engine_configuration_s;
@ -2562,4 +2576,4 @@ typedef struct {
#endif
// end
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sat Mar 09 23:22:39 EST 2019
// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Mar 10 11:52:06 EDT 2019

View File

@ -310,8 +310,8 @@
#define vbattAdcChannel_offset_hex 201
#define fuelLevelSensor_offset 514
#define fuelLevelSensor_offset_hex 202
#define unusedtps_offset 515
#define unusedtps_offset_hex 203
#define tps2AdcChannel_offset 515
#define tps2AdcChannel_offset_hex 203
#define overrideCrankingIgnition_offset 516
#define overrideCrankingIgnition_offset_hex 204
#define sensorChartFrequency_offset 520
@ -500,14 +500,16 @@
#define unusedEtbM_offset_hex 2a3
#define digitalPotentiometerSpiDevice_offset 676
#define digitalPotentiometerSpiDevice_offset_hex 2a4
#define etbDirectionPin1_offset 680
#define etbDirectionPin1_offset_hex 2a8
#define etbDirectionPin2_offset 681
#define etbDirectionPin2_offset_hex 2a9
#define etbControlPin1_offset 682
#define etbControlPin1_offset_hex 2aa
#define etbControlPin2_offset 683
#define etbControlPin2_offset_hex 2ab
#define etb1_offset 680
#define etb1_offset_hex 2a8
#define etb1_directionPin1_offset 680
#define etb1_directionPin1_offset_hex 2a8
#define etb1_directionPin2_offset 681
#define etb1_directionPin2_offset_hex 2a9
#define etb1_controlPin1_offset 682
#define etb1_controlPin1_offset_hex 2aa
#define etb1_controlPin2_offset 683
#define etb1_controlPin2_offset_hex 2ab
#define fuelLevelEmptyTankVoltage_offset 684
#define fuelLevelEmptyTankVoltage_offset_hex 2ac
#define fuelLevelFullTankVoltage_offset 688
@ -1646,8 +1648,18 @@
#define etb_iTermMax_offset_hex f8e
#define etbDeadband_offset 3984
#define etbDeadband_offset_hex f90
#define mainUnusedEnd_offset 3988
#define mainUnusedEnd_offset_hex f94
#define etb2_offset 3988
#define etb2_offset_hex f94
#define etb2_directionPin1_offset 3988
#define etb2_directionPin1_offset_hex f94
#define etb2_directionPin2_offset 3989
#define etb2_directionPin2_offset_hex f95
#define etb2_controlPin1_offset 3990
#define etb2_controlPin1_offset_hex f96
#define etb2_controlPin2_offset 3991
#define etb2_controlPin2_offset_hex f97
#define mainUnusedEnd_offset 3992
#define mainUnusedEnd_offset_hex f98
#define cltCrankingCorrBins_offset 6480
#define cltCrankingCorrBins_offset_hex 1950
#define cltCrankingCorr_offset 6512

View File

@ -247,10 +247,10 @@ static void showEthInfo(void) {
scheduleMsg(&logger, "dir=%d DC=%f", dcMotor.isOpenDirection(), dcMotor.Get());
scheduleMsg(&logger, "etbControlPin1=%s duty=%.2f freq=%d",
hwPortname(CONFIGB(etbControlPin1)),
hwPortname(CONFIGB(etb1.controlPin1)),
currentEtbDuty,
engineConfiguration->etbFreq);
scheduleMsg(&logger, "close dir=%s", hwPortname(CONFIGB(etbDirectionPin2)));
scheduleMsg(&logger, "close dir=%s", hwPortname(CONFIGB(etb1.directionPin2)));
pid.showPidStatus(&logger, "ETB");
}
@ -318,21 +318,25 @@ void setDefaultEtbParameters(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
// CONFIGB(etbControlPin1) = GPIOE_4; // test board, matched default fuel pump relay
}
static bool isSamePins(etb_io *current, etb_io *active) {
return current->controlPin1 != active->controlPin1 ||
current->controlPin2 != active->controlPin2 ||
current->directionPin1 != active->directionPin1 ||
current->directionPin2 != active->directionPin2;
}
bool isETBRestartNeeded(void) {
/**
* We do not want any interruption in HW pin while adjusting other properties
*/
return engineConfiguration->bc.etbControlPin1 != activeConfiguration.bc.etbControlPin1 ||
engineConfiguration->bc.etbControlPin2 != activeConfiguration.bc.etbControlPin2 ||
engineConfiguration->bc.etbDirectionPin1 != activeConfiguration.bc.etbDirectionPin1 ||
engineConfiguration->bc.etbDirectionPin2 != activeConfiguration.bc.etbDirectionPin2;
return isSamePins(&engineConfiguration->bc.etb1, &activeConfiguration.bc.etb1);
}
void stopETBPins(void) {
unmarkPin(activeConfiguration.bc.etbControlPin1);
unmarkPin(activeConfiguration.bc.etbControlPin2);
unmarkPin(activeConfiguration.bc.etbDirectionPin1);
unmarkPin(activeConfiguration.bc.etbDirectionPin2);
unmarkPin(activeConfiguration.bc.etb1.controlPin1);
unmarkPin(activeConfiguration.bc.etb1.controlPin2);
unmarkPin(activeConfiguration.bc.etb1.directionPin1);
unmarkPin(activeConfiguration.bc.etb1.directionPin2);
}
void onConfigurationChangeElectronicThrottleCallback(engine_configuration_s *previousConfiguration) {
@ -346,7 +350,7 @@ void startETBPins(void) {
// this line used for PWM
startSimplePwmExt(&etbPwmUp, "etb1",
&engine->executor,
CONFIGB(etbControlPin1),
CONFIGB(etb1.controlPin1),
&enginePins.etbOutput1,
freq,
0.80,
@ -359,8 +363,8 @@ void startETBPins(void) {
0.80,
applyPinState);
*/
outputDirectionOpen.initPin("etb dir open", CONFIGB(etbDirectionPin1));
outputDirectionClose.initPin("etb dir close", CONFIGB(etbDirectionPin2));
outputDirectionOpen.initPin("etb dir open", CONFIGB(etb1.directionPin1));
outputDirectionClose.initPin("etb dir close", CONFIGB(etb1.directionPin2));
}
static void setTempOutput(float value) {

View File

@ -97,10 +97,10 @@ void EnginePins::unregisterPins() {
sdCsPin.unregisterOutput(activeConfiguration.bc.sdCardCsPin, engineConfiguration->bc.sdCardCsPin);
accelerometerCs.unregisterOutput(activeConfiguration.LIS302DLCsPin, engineConfiguration->LIS302DLCsPin);
etbOutput1.unregisterOutput(activeConfiguration.bc.etbDirectionPin1,
engineConfiguration->bc.etbDirectionPin1);
etbOutput2.unregisterOutput(activeConfiguration.bc.etbDirectionPin2,
engineConfiguration->bc.etbDirectionPin2);
etbOutput1.unregisterOutput(activeConfiguration.bc.etb1.directionPin1,
engineConfiguration->bc.etb1.directionPin1);
etbOutput2.unregisterOutput(activeConfiguration.bc.etb1.directionPin2,
engineConfiguration->bc.etb1.directionPin2);
checkEnginePin.unregisterOutput(activeConfiguration.bc.malfunctionIndicatorPin,
engineConfiguration->bc.malfunctionIndicatorPin);
dizzyOutput.unregisterOutput(activeConfiguration.dizzySparkOutputPin,

View File

@ -393,7 +393,7 @@ log_format_e logFormat;
adc_channel_e tpsAdcChannel;See aslo pedalPositionAdcChannel
adc_channel_e vbattAdcChannel;
adc_channel_e fuelLevelSensor;
uint8_t[1] unusedtps;
adc_channel_e tps2AdcChannel;Second throttle body position sensor
int overrideCrankingIgnition;
int sensorChartFrequency;;"index", 1, 0, 0, 300, 0 ; size 4
@ -454,6 +454,13 @@ struct idle_hardware_s
brain_pin_e stepperStepPin;
pin_output_mode_e solenoidPinMode;
end_struct
struct etb_io
brain_pin_e directionPin1;
brain_pin_e directionPin2;
brain_pin_e controlPin1;
brain_pin_e controlPin2;
end_struct
struct_no_prefix board_configuration_s
idle_hardware_s idle;
@ -505,10 +512,7 @@ spi_device_e digitalPotentiometerSpiDevice;Digital Potentiometer is used by stoc
custom adc_channel_mode_e 4 bits, U32, @OFFSET@, [0:1], "Off", "Slow", "Fast", "INVALID"
brain_pin_e etbDirectionPin1;
brain_pin_e etbDirectionPin2;
brain_pin_e etbControlPin1;
brain_pin_e etbControlPin2;
etb_io etb1
float fuelLevelEmptyTankVoltage;;"V", 1, 0, 0,10, 2
float fuelLevelFullTankVoltage;;"V", 1, 0, 0,10, 2
@ -979,7 +983,8 @@ tChargeMode_e tChargeMode;
int16_t etb_iTermMin;iTerm min value;"", 1, 0, -30000, 30000.0, 0
int16_t etb_iTermMax;iTerm max value;"", 1, 0, -30000, 30000.0, 0
float etbDeadband;;"", 1, 0, 0, 100.0, 2
int[623] mainUnusedEnd;
etb_io etb2
int[622] mainUnusedEnd;
end_struct

View File

@ -1477,6 +1477,7 @@ cmd_set_engine_type_etb_test = "w\x00\x30\x00\x3A"
field = "IAT ADC input", iat_adcChannel
field = "vBatt ADC input", vbattAdcChannel
field = "TPS ADC input", tpsAdcChannel
field = "TPS2 ADC input", tps2AdcChannel
field = "MAF ADC input", mafAdcChannel
field = "AFR ADC input", afr_hwChannel
field = "fuelLevelSensor", fuelLevelSensor
@ -1507,10 +1508,14 @@ cmd_set_engine_type_etb_test = "w\x00\x30\x00\x3A"
field = "Idle Stepper Enable", stepperEnablePin
field = "Fuel Pump Pin", fuelPumpPin
field = "Fuel Pump Pin Mode", fuelPumpPinMode
field = "ETB Dir #1", etbDirectionPin1
field = "ETB Dir #2", etbDirectionPin2
field = "ETB Control #1", etbControlPin1
field = "ETB Control #2", etbControlPin2
field = "ETB#1 Dir #1", etb1_directionPin1
field = "ETB#1 Dir #2", etb1_directionPin2
field = "ETB#1 Control #1", etb1_controlPin1
field = "ETB#1 Control #2", etb1_controlPin2
field = "ETB#2 Dir #1", etb2_directionPin1
field = "ETB#2 Dir #2", etb2_directionPin2
field = "ETB#2 Control #1", etb2_controlPin1
field = "ETB#2 Control #2", etb2_controlPin2
field = "SD CS Pin", sdCardCsPin
field = "Check Engine Pin", malfunctionIndicatorPin
field = "Check Engine Pin Mode", malfunctionIndicatorPinMode
@ -2229,10 +2234,14 @@ cmd_set_engine_type_etb_test = "w\x00\x30\x00\x3A"
field = "Throttle Pedal Up", throttlePedalUpVoltage
field = "Throttle Pedal Wide Open", throttlePedalWOTVoltage
field = "PWM Frequency", etbFreq, {throttlePedalPositionAdcChannel != 16}
field = "Dir #1", etbDirectionPin1, {throttlePedalPositionAdcChannel != 16}
field = "Dir #2", etbDirectionPin2, {throttlePedalPositionAdcChannel != 16}
field = "Control #1", etbControlPin1, {throttlePedalPositionAdcChannel != 16}
field = "Control #2", etbControlPin2, {throttlePedalPositionAdcChannel != 16}
field = "#1 Direction #1", etb1_directionPin1, {throttlePedalPositionAdcChannel != 16}
field = "#1 Direction #2", etb1_directionPin2, {throttlePedalPositionAdcChannel != 16}
field = "#1 Control #1", etb1_controlPin1, {throttlePedalPositionAdcChannel != 16}
field = "#1 Control #2", etb1_controlPin2, {throttlePedalPositionAdcChannel != 16}
field = "#2 Direction #1", etb2_directionPin1, {throttlePedalPositionAdcChannel != 16}
field = "#2 Direction #2", etb2_directionPin2, {throttlePedalPositionAdcChannel != 16}
field = "#2 Control #1", etb2_controlPin1, {throttlePedalPositionAdcChannel != 16}
field = "#2 Control #2", etb2_controlPin2, {throttlePedalPositionAdcChannel != 16}
field = "pFactor", etb_pFactor, {throttlePedalPositionAdcChannel != 16}
field = "iFactor", etb_iFactor, {throttlePedalPositionAdcChannel != 16}
field = "dFactor", etb_dFactor, {throttlePedalPositionAdcChannel != 16}

View File

@ -1,6 +1,6 @@
package com.rusefi.config;
// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sat Mar 09 23:22:39 EST 2019
// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Sun Mar 10 11:53:40 EDT 2019
public class Fields {
public static final int LE_COMMAND_LENGTH = 200;
public static final int BLOCKING_FACTOR = 400;
@ -204,8 +204,8 @@ public class Fields {
public static final int vbattAdcChannel_offset_hex = 201;
public static final int fuelLevelSensor_offset = 514;
public static final int fuelLevelSensor_offset_hex = 202;
public static final int unusedtps_offset = 515;
public static final int unusedtps_offset_hex = 203;
public static final int tps2AdcChannel_offset = 515;
public static final int tps2AdcChannel_offset_hex = 203;
public static final int overrideCrankingIgnition_offset = 516;
public static final int overrideCrankingIgnition_offset_hex = 204;
public static final int sensorChartFrequency_offset = 520;
@ -359,10 +359,11 @@ public class Fields {
public static final int cj125CsPin_offset = 674;
public static final int unusedEtbM_offset = 675;
public static final int digitalPotentiometerSpiDevice_offset = 676;
public static final int etbDirectionPin1_offset = 680;
public static final int etbDirectionPin2_offset = 681;
public static final int etbControlPin1_offset = 682;
public static final int etbControlPin2_offset = 683;
public static final int etb1_offset = 680;
public static final int etb1_directionPin1_offset = 680;
public static final int etb1_directionPin2_offset = 681;
public static final int etb1_controlPin1_offset = 682;
public static final int etb1_controlPin2_offset = 683;
public static final int fuelLevelEmptyTankVoltage_offset = 684;
public static final int fuelLevelFullTankVoltage_offset = 688;
public static final int afr_type_offset = 692;
@ -1040,7 +1041,12 @@ public class Fields {
public static final int etb_iTermMin_offset = 3980;
public static final int etb_iTermMax_offset = 3982;
public static final int etbDeadband_offset = 3984;
public static final int mainUnusedEnd_offset = 3988;
public static final int etb2_offset = 3988;
public static final int etb2_directionPin1_offset = 3988;
public static final int etb2_directionPin2_offset = 3989;
public static final int etb2_controlPin1_offset = 3990;
public static final int etb2_controlPin2_offset = 3991;
public static final int mainUnusedEnd_offset = 3992;
public static final int cltCrankingCorrBins_offset = 6480;
public static final int cltCrankingCorrBins_offset_hex = 1950;
public static final int cltCrankingCorr_offset = 6512;
@ -1278,7 +1284,7 @@ public class Fields {
public static final Field TPSADCCHANNEL = Field.create("TPSADCCHANNEL", 512, FieldType.INT, adc_channel_e);
public static final Field VBATTADCCHANNEL = Field.create("VBATTADCCHANNEL", 513, FieldType.INT, adc_channel_e);
public static final Field FUELLEVELSENSOR = Field.create("FUELLEVELSENSOR", 514, FieldType.INT, adc_channel_e);
public static final Field UNUSEDTPS = Field.create("UNUSEDTPS", 515, FieldType.INT);
public static final Field TPS2ADCCHANNEL = Field.create("TPS2ADCCHANNEL", 515, FieldType.INT, adc_channel_e);
public static final Field OVERRIDECRANKINGIGNITION = Field.create("OVERRIDECRANKINGIGNITION", 516, FieldType.INT);
public static final Field SENSORCHARTFREQUENCY = Field.create("SENSORCHARTFREQUENCY", 520, FieldType.INT);
public static final String[] trigger_type_e = {"custom toothed wheel", "Ford Aspire", "Dodge Neon 1995", "Miata NA", "Miata NB", "GM_7X", "Cooper R50", "Mazda SOHC 4", "60/2", "36/1", "Honda 4+24+1", "Mitsubishi", "Honda 4+24", "Honda 1+4+24", "Dodge Neon 2003", "Mazda DOHC 1+4", "1+1", "1+60/2", "Single Tooth", "Dodge Ram 1+16", "60/2 VW", "Honda 1+24", "Dodge Stratus", "36_2_2_2", "Nissan Primera", "2JZ", "Rover K", "GM LS 24", "Honda CBR 600", "2JZ_1_12", "Honda CBR 600 custom", "3/1 skipped" , "Dodge Neon 2003 crank", "Miata VVT", "trg34", "trg35", "Subaru 7+6", "Jeep 18-2-2-2", "WIP", "Dodge Neon 1995 crank only", "Jeep XJ 4 cyl", "FiatIAQ_P8", "Mazda Z5", "trg43", "trg44", "trg45", "INVALID"};
@ -1367,10 +1373,10 @@ public class Fields {
public static final Field CJ125CSPIN = Field.create("CJ125CSPIN", 674, FieldType.INT, brain_pin_e);
public static final Field UNUSEDETBM = Field.create("UNUSEDETBM", 675, FieldType.INT);
public static final Field DIGITALPOTENTIOMETERSPIDEVICE = Field.create("DIGITALPOTENTIOMETERSPIDEVICE", 676, FieldType.INT);
public static final Field ETBDIRECTIONPIN1 = Field.create("ETBDIRECTIONPIN1", 680, FieldType.INT, brain_pin_e);
public static final Field ETBDIRECTIONPIN2 = Field.create("ETBDIRECTIONPIN2", 681, FieldType.INT, brain_pin_e);
public static final Field ETBCONTROLPIN1 = Field.create("ETBCONTROLPIN1", 682, FieldType.INT, brain_pin_e);
public static final Field ETBCONTROLPIN2 = Field.create("ETBCONTROLPIN2", 683, FieldType.INT, brain_pin_e);
public static final Field ETB1_DIRECTIONPIN1 = Field.create("ETB1_DIRECTIONPIN1", 680, FieldType.INT, brain_pin_e);
public static final Field ETB1_DIRECTIONPIN2 = Field.create("ETB1_DIRECTIONPIN2", 681, FieldType.INT, brain_pin_e);
public static final Field ETB1_CONTROLPIN1 = Field.create("ETB1_CONTROLPIN1", 682, FieldType.INT, brain_pin_e);
public static final Field ETB1_CONTROLPIN2 = Field.create("ETB1_CONTROLPIN2", 683, FieldType.INT, brain_pin_e);
public static final Field FUELLEVELEMPTYTANKVOLTAGE = Field.create("FUELLEVELEMPTYTANKVOLTAGE", 684, FieldType.FLOAT);
public static final Field FUELLEVELFULLTANKVOLTAGE = Field.create("FUELLEVELFULLTANKVOLTAGE", 688, FieldType.FLOAT);
public static final String[] ego_sensor_e = {"BPSX", "Innovate", "14Point7", "Narrow", "PLX", "Custom"};
@ -1891,6 +1897,10 @@ public class Fields {
public static final Field ETB_ITERMMIN = Field.create("ETB_ITERMMIN", 3980, FieldType.INT);
public static final Field ETB_ITERMMAX = Field.create("ETB_ITERMMAX", 3982, FieldType.INT);
public static final Field ETBDEADBAND = Field.create("ETBDEADBAND", 3984, FieldType.FLOAT);
public static final Field ETB2_DIRECTIONPIN1 = Field.create("ETB2_DIRECTIONPIN1", 3988, FieldType.INT, brain_pin_e);
public static final Field ETB2_DIRECTIONPIN2 = Field.create("ETB2_DIRECTIONPIN2", 3989, FieldType.INT, brain_pin_e);
public static final Field ETB2_CONTROLPIN1 = Field.create("ETB2_CONTROLPIN1", 3990, FieldType.INT, brain_pin_e);
public static final Field ETB2_CONTROLPIN2 = Field.create("ETB2_CONTROLPIN2", 3991, FieldType.INT, brain_pin_e);
public static final Field FSIOFORMULAS1 = Field.create("FSIOFORMULAS1", 6672, FieldType.INT);
public static final Field FSIOFORMULAS2 = Field.create("FSIOFORMULAS2", 6872, FieldType.INT);
public static final Field FSIOFORMULAS3 = Field.create("FSIOFORMULAS3", 7072, FieldType.INT);