Modbus-Register mapping. Optimierung?!

Servus Leute,

mein Arduino binde ich über Modbusprotokoll an die Außenwelt an. Nun habe ich einige Variablen die da rüber müssen und ich frage mich ob das vllt geschickter lösen könnte. Insbesondere wegen der Übersichtlichkeit
Die Variablen zu kopieren halte ich weiterhin für notwendig, um Zugriff von außen auf die benutzten Speicherbereiche zu vermeiden.
Das bit to integer ist sicherlich auch nicht gerade gut programmiert.
Ich benutze eine leicht abgeänderte Version der Simple Modbus lib.

Hier der Code:

void updateModbusRegs()
{
	/* modbusregister[mModbusControl]
		where
		0 = Read process values only.
		1 = Simulation of process values i.e. write Values.
		2 = Write settings.
		3 = Read settings.
		*/

	int myStatus = 0b000000000000000;
	int n = 0;
	
	
	//Mask statusbooleans to integer
	if(statusRuecknahme) bitSet(myStatus,n);
	n++;
	if(statusPumpe) bitSet(myStatus,n);
	n++;
	if(statusPumpenWaechter) bitSet(myStatus,n);
	n++;
	if(statusTempWaechter) bitSet(myStatus,n);
	n++;
	if(statusPriTuer) bitSet(myStatus,n); 
	n++;
	if(statusAnheizklappe) bitSet(myStatus,n);
	n++;
	if(btnStartVergaser) bitSet(myStatus,n);
	n = 0;
	
	//Update all the registers
	//Process values	
	modbusregister[statusBits]			 = myStatus;
	if (modbusregister[mModbusControl] != 1) //Will be only updated when simulation is not active (bidirectional values)
	{	
	modbusregister[mAbgastemperatur]	 = floatToModbusInt(Abgastemperatur);
	modbusregister[mRuecklauftemperatur] = floatToModbusInt(Ruecklauftemperatur);
	modbusregister[mKesseltemperatur]	 = floatToModbusInt(Kesseltemperatur);
	modbusregister[mSauerstoff]			 = floatToModbusInt(Sauerstoff);
	}	
	modbusregister[mPriLuftAusgang]		 = byteToPercent(PriLuftAusgang);
	modbusregister[mSekLuftAusgang]		 = byteToPercent(SekLuftAusgang);
	modbusregister[mSaugzugAusgang]		 = byteToPercent(SaugZugAusgang);
	modbusregister[mSchrittkette]		 = Schrittkette;
	//Settings
	if(modbusregister[mModbusControl] == 3 ) //to save some time this will only executed when the operator needs the data. Write 3 to ModbusControl and read the data in the next circle
	{
	modbusregister[mAbgastemperaturSollwert]		= AbgastemperaturSollwert;
	modbusregister[mSauerstoffSollwert]				= SauerstoffSollwert;
	modbusregister[mAbgastemperaturRuecknahme]		= AbgastemperaturRuecknahme;
	modbusregister[mAbgastemperaturMax]				= AbgastemperaturMax;
	modbusregister[mAbgastemperaturAusschaltWert]	= AbgastemperaturAusschaltWert;
	modbusregister[mSauerstoffMin]					= SauerstoffMin;
	modbusregister[mSauerstoffMinMin]				= SauerstoffMinMin;
	modbusregister[mKesseltemperaturEinWert]		= KesseltemperaturEinWert;
	modbusregister[mKesseltemperaturMax]			= KesseltemperaturMax;
	modbusregister[mKesseltemeraturMaxMax]			= KesseltemeraturMaxMax;
	modbusregister[mKTempPumpeAn]					= KTempPumpeAn;
	modbusregister[mHeizbetriebPumpeAn]				= HeizbetriebPumpeAn;
	modbusregister[mAusbrandPumpeAus]				= AusbrandPumpeAus;
	modbusregister[mstartWertPriLuft]				= startWertPriLuft;
	modbusregister[mSaugZugStart]					= byteToPercent(SaugZugStart);
	modbusregister[mPriLuftAusgangMin]				= byteToPercent(PriLuftAusgangMin);
	modbusregister[mmaxPriLuftGradient]				= byteToPercent(maxPriLuftGradient);
	modbusregister[mSekLuftAusgangMin]				= byteToPercent(SekLuftAusgangMin);
	modbusregister[mstartZeitPriluft]				= startZeitPriluft;
	modbusregister[mmaxZeitAnheizklappeOffen]		= maxZeitAnheizklappeOffen;
	}	
	modbus_update(modbusregister);
	
	//Update der zu schreibenden Variablen
	if (modbusregister[mModbusControl] > 0)
	{
		boolean stbool;
		int buffReg;
		if (modbusregister[mModbusControl] == 1) //Simulation
		{
			
			myStatus = modbusregister[mInStatusBits];
			n = 0;
			if ((stbool = bitRead(myStatus,n))) btnStartVergaser = stbool;
			else btnStartVergaser = 0;
			n++;
			if ((stbool = bitRead(myStatus,n))) statusPriTuer = stbool;
			else statusPriTuer = 0;
			n++;
			if ((stbool = bitRead(myStatus,n))) statusAnheizklappe = stbool;
			else statusAnheizklappe = 0;
			
			Abgastemperatur = float(modbusregister[mAbgastemperatur]);
			Ruecklauftemperatur = float(modbusregister[mRuecklauftemperatur]);
			Kesseltemperatur = float(modbusregister[mKesseltemperatur]);
			Sauerstoff = float(modbusregister[mSauerstoff]);
		}
				
		if (modbusregister[mModbusControl] == 2) //Operator wants to write some values. All values should be !=0!
		{
			if ( (buffReg = modbusregister[mAbgastemperaturSollwert]) > 0 )		AbgastemperaturSollwert = buffReg;
			if ( (buffReg = modbusregister[mSauerstoffSollwert]) > 0 )			SauerstoffSollwert = buffReg;
			if ( (buffReg = modbusregister[mAbgastemperaturRuecknahme]) > 0 )	AbgastemperaturRuecknahme = buffReg;
			if ( (buffReg = modbusregister[mAbgastemperaturMax]) > 0)			AbgastemperaturMax = buffReg;
			if ( (buffReg = modbusregister[mAbgastemperaturAusschaltWert]) > 0) AbgastemperaturAusschaltWert = buffReg;
			if ( (buffReg = modbusregister[mSauerstoffMin]) > 0)				SauerstoffMin = buffReg;
			if ( (buffReg = modbusregister[mSauerstoffMinMin]) > 0)				SauerstoffMinMin = buffReg;
			if ( (buffReg = modbusregister[mKesseltemperaturEinWert]) > 0)		KesseltemperaturEinWert = buffReg;
			if ( (buffReg = modbusregister[mKesseltemperaturMax]) > 0)			KesseltemperaturMax = buffReg;
			// const! if ( buffReg = modbusregister[mKesseltemeraturMaxMax] > 0) KesseltemperaturMaxMax
			if ( (buffReg = modbusregister[mKTempPumpeAn]) > 0)					KTempPumpeAn = buffReg;
			if ( (buffReg = modbusregister[mHeizbetriebPumpeAn]) > 0)			HeizbetriebPumpeAn = buffReg;
			if ( (buffReg = modbusregister[mAusbrandPumpeAus]) > 0)				AusbrandPumpeAus = buffReg;
			if ( (buffReg = modbusregister[mstartWertPriLuft]) > 0)				startWertPriLuft = buffReg;
			if ( (buffReg = modbusregister[mSaugZugStart]) > 0)					SaugZugStart = buffReg;
			if ( (buffReg = modbusregister[mPriLuftAusgangMin]) > 0)			PriLuftAusgangMin = percentToByte(buffReg);
			if ( (buffReg = modbusregister[mSekLuftAusgangMin]) > 0)			SekLuftAusgangMin = percentToByte(buffReg);
			if ( (buffReg = modbusregister[mstartZeitPriluft]) > 0)				startZeitPriluft = buffReg;
			if ( (buffReg = modbusregister[mmaxZeitAnheizklappeOffen]) > 0)		maxZeitAnheizklappeOffen = buffReg;
		}		
	}
}

Und das zugehörige enum:

//Modbusregister--------------------------------------------
enum
{
	statusBits,					//0
	mAbgastemperatur,
	mRuecklauftemperatur,
	mKesseltemperatur,
	mSauerstoff,
	mPriLuftAusgang,
	mSekLuftAusgang,
	mSaugzugAusgang,
	mSchrittkette,				//8 
	
	mModbusControl,				//0 bzw. 9
	mInStatusBits,				
	mAbgastemperaturSollwert,
	mSauerstoffSollwert,
	mAbgastemperaturRuecknahme,
	mAbgastemperaturMax,
	mAbgastemperaturAusschaltWert,
	mSauerstoffMin,
	mSauerstoffMinMin,
	mKesseltemperaturEinWert,
	mKesseltemperaturMax,
	mKesseltemeraturMaxMax,
	mKTempPumpeAn,
	mHeizbetriebPumpeAn,
	mAusbrandPumpeAus,
	mstartWertPriLuft,
	mSaugZugStart,
	mPriLuftAusgangMin,
	mmaxPriLuftGradient,
	mSekLuftAusgangMin,
	mstartZeitPriluft,
	mmaxZeitAnheizklappeOffen,
	// leave this one
	TOTAL_REGS_SIZE
	// total number of registers for function 3 and 16 share the same register array
};
int modbusregister[TOTAL_REGS_SIZE];

Eine Idee wäre zumindest meine Sollwerte auch als enum an zu legen und dann per Index kopieren. Dann müßten aber alles in gleicher Reihenfolge sein. Also auch nicht wirklich eine Verbesserung.