Proview Arduino sketch

Here is part of the sketch for using Arduino Uno with Proview (www.proview.se) process control system. For some reason The Analog PWM outputs don't work and everything else does.

//

// Reset all outputs when communication communication is down
void resetOutput()
{  
  for ( i = 0; i < doSize; i++) {
    for ( j = 0; j < 8; j++) {
      if ( ((1 << j) & doMask[i]) != 0)
        digitalWrite( i * 8 + j, LOW);
    }
  }
  for ( i = 0; i < aoCnt; i++)
    analogWrite( aoList[i], 0);
}
//
//  Read a message from the serial port
//
int serialRead()
{
  int num;
  int csum;
  num = Serial.available();
  if ( num == 0)
    return ARD__NOMSG;
  msgSize = Serial.peek();
  if ( num < msgSize)
    return ARD__MSGSIZE;
  msgSize = Serial.read();
  msgId = Serial.read();
  msgType = Serial.read();
  msgSize -= 3;
  for ( int i = 0; i < msgSize; i++)
    msgData[i] = Serial.read();
  csum = check_checksum( msgSize + 3, msgId, msgType, msgData);
  if ( debug) {
    rmsg[0] = msgSize + 3 - 1;
    rmsg[1] = msgId;
    rmsg[2] = MSG_TYPE_DEBUG;
    for ( int j = 0; j < msgSize-1; j++)
      rmsg[j+3] = msgData[j];
    add_checksum( rmsg);
    Serial.write( rmsg, rmsg[0]);
  }
  msgSize--;
   if ( !csum)
    return ARD__CHECKSUM;
    return ARD__SUCCESS;
}
void setup()
{
  // Start serial port at the configured baud rate
  Serial.begin(9600);
  Serial.flush();
}
void loop()
{
   status = serialRead();
  if ( status == ARD__NOMSG) {
    if ( watchdogTime != 0) {
      // Increment watchdog counter
      noMessageCnt++;
       if ( noMessageCnt * delayTime > watchdogTime)
         resetOutput();
    }
  }
  else if ( status == ARD__MSGSIZE) {
    sizeErrorCnt++;
    if ( sizeErrorCnt > 50) {
      Serial.flush();
      sizeErrorCnt = 0;
    }
  }
  else if ( (status & 1) != 0) {
    // A message is received
    sizeErrorCnt = 0;
    noMessageCnt = 0;
    if ( msgType == MSG_TYPE_DOWRITE) {
      // Write digital outputs
      if ( msgSize == doSize) {
        for ( i = 0; i < doSize; i++) {
          for ( j = 0; j < 8; j++) {
            if ( ((1 << j) & doMask[i]) != 0) {
              if ( ((1 << j) & msgData[i]) != 0)
                digitalWrite( i * 8 + j, HIGH);          
              else
                digitalWrite( i * 8 + j, LOW);          
            }
          }
        }
        sts = ARD__SUCCESS;
      }
      else {
        sts = ARD__COMMERROR;
      }
    }
    else if ( msgType == MSG_TYPE_AOWRITE) {
      // Write analog outputs
      if ( msgSize == aoCnt) {
        for ( i = 0; i < aoCnt; i++)
   	  analogWrite( aoList[i], msgData[i]);
        sts = ARD__SUCCESS;
      }
      else {
        sts = ARD__COMMERROR;
      }
    }
    else if ( msgType == MSG_TYPE_WRITEALL) {
      // Write digital outputs
      if ( msgSize == doSize + aoCnt) {
        for ( i = 0; i < doSize; i++) {
          for ( j = 0; j < 8; j++) {
            if ( ((1 << j) & doMask[i]) != 0) {
              if ( ((1 << j) & msgData[i]) != 0)
                digitalWrite( i * 8 + j, HIGH);          
              else
                digitalWrite( i * 8 + j, LOW);          
            }
          }
        }
        for ( i = 0; i < aoCnt; i++)
   	  analogWrite( aoList[i], msgData[doSize + i]);
        sts = ARD__SUCCESS;
      }
      else {
        sts = ARD__COMMERROR;
      }
    }
    else if ( msgType == MSG_TYPE_DIREAD) {
      // Read Digital inputs
      smsg[0] = diSize + 3;
      smsg[1] = msgId;
      smsg[2] = MSG_TYPE_DIREAD;
      for ( i = 0; i < diSize; i++) {
        smsg[i + 3] = 0;
        for ( j = 0; j < 8; j++) {
          if ( ((1 << j) & diMask[i]) != 0) {
            val = digitalRead( i * 8 + j);
            if ( val == HIGH) 
              smsg[i + 3] |= 1 << j;
          }
        }
      }
      add_checksum( smsg);
      Serial.write( smsg, smsg[0]);
    }
    else if ( msgType == MSG_TYPE_AIREAD) {
      // Read analog inputs
      amsg[0] = aiCnt * 2 + 3;
      amsg[1] = msgId;
      amsg[2] = MSG_TYPE_AIREAD;
      for ( i = 0; i < aiCnt; i++) {
        val = analogRead( aiList[i]);
        amsg[i*2 + 3] = val / 256;
        amsg[i*2 + 1 + 3] = val % 256;
      }
      add_checksum( amsg);
      Serial.write( amsg, amsg[0]);
    }
    else if ( msgType == MSG_TYPE_READALL) {
      // Read Digital inputs
      amsg[0] = diSize + aiCnt * 2 + 3;
      amsg[1] = msgId;
      amsg[2] = MSG_TYPE_READALL;
      for ( i = 0; i < diSize; i++) {
        amsg[i + 3] = 0;
        for ( j = 0; j < 8; j++) {
          if ( ((1 << j) & diMask[i]) != 0) {
            val = digitalRead( i * 8 + j);
            if ( val == HIGH) 
              amsg[i + 3] |= 1 << j;
          }
        }
      }
      for ( i = 0; i < aiCnt; i++) {
        val = analogRead( aiList[i]);
        amsg[diSize + i*2 + 3] = val / 256;
        amsg[diSize + i*2 + 1 + 3] = val % 256;
      }
      add_checksum( amsg);
      Serial.write( amsg, amsg[0]);
    }
    else if ( msgType == MSG_TYPE_CONFIGURE) {
      // Configure message
      int offs = 0;
      sts = ARD__SUCCESS;
      if ( debug) {
        smsg[0] = msgSize + 3;
        smsg[1] = msgId;
        smsg[2] = MSG_TYPE_DEBUG;
        for ( int j = 0; j < msgSize; j++)
          smsg[j+3] = msgData[j];
	add_checksum( smsg);
        Serial.write( smsg, smsg[0]);
      }
      watchdogTime = msgData[offs++] * 100;
      diSize = msgData[offs++];
      if ( diSize > 10) {
        diSize = 10;
        sts = ARD__DICONFIG;
      }
      if ( sts & 1 != 0) {  
        for ( i = 0; i < diSize; i++)
          diMask[i] = msgData[offs++];
      }        
      if ( sts & 1 != 0) {  
        doSize = msgData[offs++];
        if ( doSize > 10) {
          doSize = 10;
          sts = ARD__DOCONFIG;
        }
      }
      if ( sts & 1 != 0) {        
        for ( i = 0; i < doSize; i++)
          doMask[i] = msgData[offs++];
      }
      if ( sts & 1 != 0) {        
        aiSize = msgData[offs++];
        if ( aiSize > 4) {
          aiSize = 4;
          sts = ARD__AICONFIG;
        } 
      }
      if ( sts & 1 != 0) {        
        for ( i = 0; i < aiSize; i++)
          aiMask[i] = msgData[offs++];
      }
      if ( sts & 1 != 0) {        
        aoSize = msgData[offs++];
        if ( aoSize > 4) {
          aoSize = 4;
          sts = ARD__AOCONFIG;
        }        
      }
      if ( sts & 1 != 0) {  
        for ( i = 0; i < aoSize; i++)
          aoMask[i] = msgData[offs++];
      }
      if ( sts & 1 != 0) {  
        // Set Di pinmode
        for ( i = 0; i < diSize; i++) {
          for ( j = 0; j < 8; j++) {
            if ( ((1 << j) & diMask[i]) != 0)
              pinMode( i * 8 + j, INPUT);          
          }
        }
        // Set Do pinmode
        for ( i = 0; i < doSize; i++) {
          for ( j = 0; j < 8; j++) {
            if ( ((1 << j) & doMask[i]) != 0)
              pinMode( i * 8 + j, OUTPUT);          
          }
        }  
        // Create list of configured Ai
        aiCnt = 0;
        for ( i = 0; i < aiSize; i++) {
          for ( j = 0; j < 8; j++) {
            if ( ((1 << j) & aiMask[i]) != 0) {
              aiList[aiCnt] = i * 8 + j;
              aiCnt++;
            }
          }
        }
        // Create list of configured Ao
        aoCnt = 0;
        for ( i = 0; i < aoSize; i++) {
          for ( j = 0; j < 8; j++) {
            if ( ((1 << j) & aoMask[i]) != 0) {
              aoList[aoCnt] = i * 8 + j;
              aoCnt++;
            }
          }
        }
      }
      // Send configuration status
      smsg[0] = 4;
      smsg[1] = msgId;
      smsg[2] = MSG_TYPE_STATUS;
      smsg[3] = sts;
      add_checksum( smsg);
      Serial.write(smsg, smsg[0]);
    }
    else if ( msgType == MSG_TYPE_CONNECTREQ) {
      // Connect reqeust
      amsg[0] = 23 + 3;
      amsg[1] = msgId;
      amsg[2] = MSG_TYPE_CONNECTRES;
      amsg[3] = ARD__SUCCESS;
      amsg[4] = version_major;
      amsg[5] = version_minor;
      for ( i = 0; i < 20; i++)
        amsg[i+6] = firmware[i];
      add_checksum( amsg);
      Serial.write( amsg, amsg[0]);
    }
  }
  else {
    // Return error status
    smsg[0] = 4;
    smsg[1] = msgId;
    smsg[2] = MSG_TYPE_STATUS;
    smsg[3] = status;
    add_checksum( smsg);
    Serial.write(smsg, smsg[0]);
  }
  delay(delayTime); 
}

Any help is highly appreciated. Attached the full sketch.
Regards,
Angel

pwr_arduino_uno.ino (10.6 KB)