Skip to content

BACNET

Настройки драйвера

ts
export const bacnetValidationSchema = z.object({
  settings: bacnetSettingsSchema,
});

Настройки связи по доступу

Настройки всегда хранятся в БД целиком — доступ связи (чтение/запись) определяет только видимость полей в редакторе и состав запроса, уходящего на контроллер.

НастройкаЧт.Зап.
IP адрес
порт
тип объекта
экземпляр объекта
свойство(ID)
тип значения
приоритет

Типы

ts
export interface IReadBACNETDriverSettings {
  /** IP-адрес BACnet-устройства */
  [EDriverSettingsType.ADDRESS]: string;
  /** id объекта PLC, к которому привязан линк (usePlcDriverLinkSync) */
  [EDriverSettingsType.PLC_ID]?: string;
  /** отображаемое имя PLC для подписей в редакторе */
  [EDriverSettingsType.PLC_NAME]?: string;
  /** порт BACnet-устройства */
  [EDriverSettingsType.PORT]: string;
  /** тип BACnet-объекта (аналоговый/бинарный вход/выход и т.д.) */
  [EDriverSettingsType.TYPE]: EBACNETdriverLinkType;
  /** отображаемое имя типа (ключ EBACNETdriverLinkType как строка) */
  [EDriverSettingsType.TYPE_NAME]: string;
  /** instance number BACnet-объекта */
  [EDriverSettingsType.INSTANCE]: string;
  /** свойство BACnet-объекта (present value и др.); строка — свободные ключи импорта */
  [EDriverSettingsType.PROPERTYID]: EBACNETdriverLinkPropertyId | string;
  /** кодировка значения (application tag) BACnet */
  [EDriverSettingsType.APPLICATION_TAGS]: EBACNETdriverLinkApplicationTags;
  /** приоритет записи BACnet (0–16, 0 — без приоритета) */
  [EDriverSettingsType.PRIORITY]: EBACNETdriverLinkPriority;
}

Стратегия импорта

О том что такое стратегия импорта можно почитать здесь Таб импорта в драйверах

Зависимость objectType от поля type (высший приоритет в определении типа)

ts
// Маппинг MQTT типов на объекты BMS
const mapAddtitionalTypeToObjectType = (
  type: string,
): { type: EObjectType; settings: any; display: ObjectDisplay } | null => {
  switch (type) {
    case "AI":
      return {
        type: EObjectType.ANALOG_INPUT,
        settings: defaultAnalogInputSettings,
        display: defaultAnalogInputObjectDisplay,
      };
    case "AO":
      return {
        type: EObjectType.ANALOG_OUTPUT,
        settings: defaultAnalogOutputSettings,
        display: defaultAnalogOutputObjectDisplay,
      };
    case "DI":
      return {
        type: EObjectType.DIGITAL_INPUT,
        settings: defaultDigitalInputSettings,
        display: defaultDigitalInputObjectDisplay,
      };
    case "DO":
      return {
        type: EObjectType.DIGITAL_OUTPUT,
        settings: defaultDigitalOutputSettings,
        display: defaultDigitalOutputObjectDisplay,
      };
    case "M":
      return {
        type: EObjectType.MODE_OBJECT,
        settings: defaultModeObjectSettings,
        display: defaultModeObjectDisplay,
      };
    default:
      return null;
  }
};

Зависимость objectType от поля object-type

ts
// Маппинг BACNET object-type на объекты BMS
const mapBACNETTypeToObjectType = (
  type: number,
): { type: EObjectType; settings: any; display: ObjectDisplay } | null => {
  switch (type) {
    case 0:
      return {
        type: EObjectType.ANALOG_INPUT,
        settings: defaultAnalogInputSettings,
        display: defaultAnalogInputObjectDisplay,
      };
    case 1:
    case 2:
    case 12:
      return {
        type: EObjectType.ANALOG_OUTPUT,
        settings: defaultAnalogOutputSettings,
        display: defaultAnalogOutputObjectDisplay,
      };
    case 3:
      return {
        type: EObjectType.DIGITAL_INPUT,
        settings: defaultDigitalInputSettings,
        display: defaultDigitalInputObjectDisplay,
      };
    case 4:
    case 5:
      return {
        type: EObjectType.DIGITAL_OUTPUT,
        settings: defaultDigitalOutputSettings,
        display: defaultDigitalOutputObjectDisplay,
      };
    case 19:
      return {
        type: EObjectType.MODE_OBJECT,
        settings: defaultModeObjectSettings,
        display: defaultModeObjectDisplay,
      };
    default:
      return null;
  }
};

Зависимость driver.settings.PLC от additionalData

ts
async updateDriverData({ selectedFile, additionalInfo, currentObject }): Promise<{
  objectsToUpdate?: UpdateObjectDto;
}> {
  const fileName = selectedFile.file.name;
  const objectSettings = currentObject.settings as {
    Port?: string;
    IP?: string;
    PLC?: Array<{ id: string; name: string; Port: string; IP: string }>;
  };

  this._plcId = uuidv4();

  const updatedObject: UpdateObjectDto = {
    id: currentObject.id,
    settings: {
      ...currentObject.settings,
      PLC: [
        {
          id: this._plcId,
          name: additionalInfo.PROJECT_NAME || fileName,
          Port: additionalInfo?.PORT || currentObject?.settings?.Port || "",
          IP: additionalInfo?.IP || currentObject?.settings?.IP || "",
        },
        ...(objectSettings.PLC ?? []),
      ],
    },
  };

  return {
    objectsToUpdate: updatedObject,
  };
},
ts
// Определение типа драйверлинка на основе settable
const getDriverLinkTypesFromSettable = (
  settable: string | undefined,
): EDriverLinkType[] => {
  if (!settable) {
    return [EDriverLinkType.READ];
  }

  switch (settable) {
    case "Y":
      return [EDriverLinkType.WRITE];
    case "N":
      return [EDriverLinkType.READ];
    case "B":
      return [EDriverLinkType.READ, EDriverLinkType.WRITE];
    default:
      return [EDriverLinkType.READ];
  }
};

Настройки связи по доступу

Настройки всегда хранятся в БД целиком — доступ связи (чтение/запись) определяет только видимость полей в редакторе и состав запроса, уходящего на контроллер.

НастройкаЧт.Зап.
IP адрес
порт
тип объекта
экземпляр объекта
свойство(ID)
тип значения
приоритет

Mentioned In

None yet.