Подробное объяснение сообщений OPC
Подробное объяснение сообщений OPC

OPC (OLE for Process Control) — это стандарт промышленных протоколов связи, используемый для обмена данными между оборудованием и системами разных производителей. В основном используется в системах промышленной автоматизации. Стандарт OPC имеет несколько различных спецификаций, включая OPC DA (доступ к данным), OPC UA (унифицированная архитектура), OPC HDA (доступ к историческим данным) и т. д.

В этой статье в основном представлен формат сообщений OPC UA через TCP и безопасный разговор OPC UA.

1. OPC Classic (включая OPC DA, OPC HDA и т. д.)

OPC Classic основан на технологии Microsoft COM/DCOM (объектная модель компонентов/объектная модель распределенных компонентов), поэтому он не имеет унифицированного и стандартизированного «формата сообщений», подобного TCP/IP.

В OPC Classic обмен данными и связь реализованы посредством механизма COM/DCOM, что означает, что данные передаются в форме COM-объектов, а не через определенное сообщение фиксированного формата.

2.OPC UA (Unified Architecture)

OPC UA — это более современный протокол, призванный заменить OPC Classic и обеспечить более безопасный межплатформенный механизм обмена данными. OPC UA определяет подробный набор сервисов и информационных моделей, чтобы его можно было использовать на разных транспортных уровнях, таких как TCP, HTTP и т. д.

В модели связи OPC UA взаимодействие между клиентом и сервером основано на серии сервисных запросов и ответов. Каждый запрос и ответ службы соответствуют правилам кодирования, определенным OPC UA, и могут быть сериализованы в двоичный поток или XML.

Общие сообщения OPC UA в основном делятся на две категории: OPC UA через TCP и безопасный разговор OPC UA.

2.1 Структура сообщения OPC UA через TCP

Сообщения OPC UA через TCP включают заголовки и тела сообщений. Основная структура выглядит следующим образом:

использовать

заголовок сообщения

тело сообщения

длина

8byte

неопределенный

описывать

Контроль и запись сообщений

Фактические данные, подлежащие передаче, их содержание и структура зависят от конкретного запроса или ответа службы OPC UA.

2.1.1 Заголовок сообщения

Среди них структура части заголовка сообщения следующая:

использовать

Тип сообщения

зарезервированный раздел

размер сообщения

длина

3byte

1byte

4byte

описывать

Используется для идентификации типов сообщений.

Если тип сообщения является одним из значений, поддерживаемых протоколом связи OPC UA, установите код ACSII «F».

весьзаголовок сообщения+тело длина сообщений в байтах

Часть типа сообщения разделена на четыре категории:

  • HEL: указывает, что тело сообщения является сообщением Hello.
  • ACK: указывает, что тело сообщения является сообщением подтверждения.
  • ERR: указывает, что тело сообщения представляет собой сообщение об ошибке.
  • RHE: указывает, что тело сообщения является сообщением ReverseHello.

2.1.2 Тело сообщения

2.1.2.1 Приветственное сообщение

Если тип сообщения — HEL, это означает, что тело сообщения является сообщением Hello. Конкретный формат следующий:

использовать

длина

описывать

Номер версии протокола

4byte

В этом поле указывается версия спецификации OPC UA, используемая отправителем. Получатель может использовать эту информацию, чтобы определить, может ли он понять полученное сообщение.

Размер буфера приема

4byte

Указывает максимальный размер сообщения, который получатель готов выделить для этого соединения. Он используется для управления потоком и во избежание перегрузки получателя слишком большими сообщениями. Единица измерения — байты, значение должно быть больше 8192.

Размер буфера отправки

4byte

Размер буфера сообщение. В этом поле указывается Максимальный, который отправитель намерен использовать для этого соединения. размер сообщения. Это также является частью управления потоком, гарантируя, что обе стороны могут обрабатывать обмениваемые данные. Единица измерения — байты, значение должно быть больше 8192.

Максимальный размер сообщения

4byte

В этом поле указывается максимальный размер тела сообщения, разрешенный обеими сторонами. Он используется для предотвращения проблем с производительностью, вызванных обработкой отдельных слишком больших сообщений. 0 означает, что для клиента нет ограничений.

Максимальное количество кусков

4byte

В этом поле указывается максимальное количество блоков, на которые можно разделить ответное сообщение. Это помогает управлять передачей больших объемов данных, обеспечивая эффективную передачу даже больших сообщений между двумя сторонами. 0 означает, что для клиента нет ограничений.

URL-адрес терминала

Максимум 4096 байт

URL-адрес терминала, к которому желает подключиться клиент. Если длина превышает 4096 Если ресурс, указанный по URL-адресу, не может быть распознан, сервер должен вернуть сообщение об ошибке Bad_TcpEndpointUrlInvalid и закрыть соединение.

Сообщение Hello является важной частью процесса установления связи протокола OPC UA TCP. С его помощью клиент и сервер могут обмениваться основными параметрами связи и создавать основу для последующих более сложных взаимодействий.

2.1.2.2 Подтверждающее сообщение

использовать

длина

описывать

Номер версии протокола

4byte

Версия протокола OPC UA, поддерживаемая сервером

Размер буфера приема

4byte

Указывает максимальный размер сообщения, который получатель готов выделить для этого соединения. Он используется для управления потоком и во избежание перегрузки получателя слишком большими сообщениями. Единица измерения — байты, значение должно быть больше 8192.

Размер буфера отправки

4byte

Размер буфера сообщение. В этом поле указывается Максимальный, который отправитель намерен использовать для этого соединения. размер сообщения. Это также является частью управления потоком, гарантируя, что обе стороны могут обрабатывать обмениваемые данные. Единица измерения — байты, значение должно быть больше 8192.

Максимальный размер сообщения

4byte

В этом поле указывается максимальный размер тела сообщения, разрешенный обеими сторонами. Он используется для предотвращения проблем с производительностью, вызванных обработкой отдельных слишком больших сообщений. 0 означает, что для клиента нет ограничений.

Максимальное количество кусков

4byte

В этом поле указывается максимальное количество блоков, на которые можно разделить ответное сообщение. Это помогает управлять передачей больших объемов данных, обеспечивая эффективную передачу даже больших сообщений между двумя сторонами. 0 означает, что для клиента нет ограничений.

Сообщение подтверждения предоставляет основные параметры, необходимые для связи между клиентом и сервером, гарантируя, что обе стороны могут эффективно обмениваться последующими сообщениями OPC UA. После получения сообщения подтверждения клиент настроит свои параметры связи в соответствии с предоставленными параметрами, а затем обе стороны смогут начать формальный обмен данными.

2.1.2.3 Сообщение об ошибке

использовать

длина

описывать

код ошибки

4byte

Неправильный цифровой код.

причина

Максимум 4096 байт

Подробности ошибки описать.

код ошибки будут обновляться по мере обновления версии. Вот копия кода текущей версии (UA-1.05.03-2023-12-15). список ошибок,Подробную информацию см.официальный github

имя ошибки

код ошибки

Good

0x00000000

Uncertain

0x40000000

Bad

0x80000000

BadUnexpectedError

0x80010000

BadInternalError

0x80020000

BadOutOfMemory

0x80030000

BadResourceUnavailable

0x80040000

BadCommunicationError

0x80050000

BadEncodingError

0x80060000

BadDecodingError

0x80070000

BadEncodingLimitsExceeded

0x80080000

BadRequestTooLarge

0x80B80000

BadResponseTooLarge

0x80B90000

BadUnknownResponse

0x80090000

BadTimeout

0x800A0000

BadServiceUnsupported

0x800B0000

BadShutdown

0x800C0000

BadServerNotConnected

0x800D0000

BadServerHalted

0x800E0000

BadNothingToDo

0x800F0000

BadTooManyOperations

0x80100000

BadTooManyMonitoredItems

0x80DB0000

BadDataTypeIdUnknown

0x80110000

BadCertificateInvalid

0x80120000

BadSecurityChecksFailed

0x80130000

BadCertificatePolicyCheckFailed

0x81140000

BadCertificateTimeInvalid

0x80140000

BadCertificateIssuerTimeInvalid

0x80150000

BadCertificateHostNameInvalid

0x80160000

BadCertificateUriInvalid

0x80170000

BadCertificateUseNotAllowed

0x80180000

BadCertificateIssuerUseNotAllowed

0x80190000

BadCertificateUntrusted

0x801A0000

BadCertificateRevocationUnknown

0x801B0000

BadCertificateIssuerRevocationUnknown

0x801C0000

BadCertificateRevoked

0x801D0000

BadCertificateIssuerRevoked

0x801E0000

BadCertificateChainIncomplete

0x810D0000

BadUserAccessDenied

0x801F0000

BadIdentityTokenInvalid

0x80200000

BadIdentityTokenRejected

0x80210000

BadSecureChannelIdInvalid

0x80220000

BadInvalidTimestamp

0x80230000

BadNonceInvalid

0x80240000

BadSessionIdInvalid

0x80250000

BadSessionClosed

0x80260000

BadSessionNotActivated

0x80270000

BadSubscriptionIdInvalid

0x80280000

BadRequestHeaderInvalid

0x802A0000

BadTimestampsToReturnInvalid

0x802B0000

BadRequestCancelledByClient

0x802C0000

BadTooManyArguments

0x80E50000

BadLicenseExpired

0x810E0000

BadLicenseLimitsExceeded

0x810F0000

BadLicenseNotAvailable

0x81100000

BadServerTooBusy

0x80EE0000

GoodPasswordChangeRequired

0x00EF0000

GoodSubscriptionTransferred

0x002D0000

GoodCompletesAsynchronously

0x002E0000

GoodOverload

0x002F0000

GoodClamped

0x00300000

BadNoCommunication

0x80310000

BadWaitingForInitialData

0x80320000

BadNodeIdInvalid

0x80330000

BadNodeIdUnknown

0x80340000

BadAttributeIdInvalid

0x80350000

BadIndexRangeInvalid

0x80360000

BadIndexRangeNoData

0x80370000

BadIndexRangeDataMismatch

0x80EA0000

BadDataEncodingInvalid

0x80380000

BadDataEncodingUnsupported

0x80390000

BadNotReadable

0x803A0000

BadNotWritable

0x803B0000

BadOutOfRange

0x803C0000

BadNotSupported

0x803D0000

BadNotFound

0x803E0000

BadObjectDeleted

0x803F0000

BadNotImplemented

0x80400000

BadMonitoringModeInvalid

0x80410000

BadMonitoredItemIdInvalid

0x80420000

BadMonitoredItemFilterInvalid

0x80430000

BadMonitoredItemFilterUnsupported

0x80440000

BadFilterNotAllowed

0x80450000

BadStructureMissing

0x80460000

BadEventFilterInvalid

0x80470000

BadContentFilterInvalid

0x80480000

BadFilterOperatorInvalid

0x80C10000

BadFilterOperatorUnsupported

0x80C20000

BadFilterOperandCountMismatch

0x80C30000

BadFilterOperandInvalid

0x80490000

BadFilterElementInvalid

0x80C40000

BadFilterLiteralInvalid

0x80C50000

BadContinuationPointInvalid

0x804A0000

BadNoContinuationPoints

0x804B0000

BadReferenceTypeIdInvalid

0x804C0000

BadBrowseDirectionInvalid

0x804D0000

BadNodeNotInView

0x804E0000

BadNumericOverflow

0x81120000

BadLocaleNotSupported

0x80ED0000

BadNoValue

0x80F00000

BadServerUriInvalid

0x804F0000

BadServerNameMissing

0x80500000

BadDiscoveryUrlMissing

0x80510000

BadSempahoreFileMissing

0x80520000

BadRequestTypeInvalid

0x80530000

BadSecurityModeRejected

0x80540000

BadSecurityPolicyRejected

0x80550000

BadTooManySessions

0x80560000

BadUserSignatureInvalid

0x80570000

BadApplicationSignatureInvalid

0x80580000

BadNoValidCertificates

0x80590000

BadIdentityChangeNotSupported

0x80C60000

BadRequestCancelledByRequest

0x805A0000

BadParentNodeIdInvalid

0x805B0000

BadReferenceNotAllowed

0x805C0000

BadNodeIdRejected

0x805D0000

BadNodeIdExists

0x805E0000

BadNodeClassInvalid

0x805F0000

BadBrowseNameInvalid

0x80600000

BadBrowseNameDuplicated

0x80610000

BadNodeAttributesInvalid

0x80620000

BadTypeDefinitionInvalid

0x80630000

BadSourceNodeIdInvalid

0x80640000

BadTargetNodeIdInvalid

0x80650000

BadDuplicateReferenceNotAllowed

0x80660000

BadInvalidSelfReference

0x80670000

BadReferenceLocalOnly

0x80680000

BadNoDeleteRights

0x80690000

UncertainReferenceNotDeleted

0x40BC0000

BadServerIndexInvalid

0x806A0000

BadViewIdUnknown

0x806B0000

BadViewTimestampInvalid

0x80C90000

BadViewParameterMismatch

0x80CA0000

BadViewVersionInvalid

0x80CB0000

UncertainNotAllNodesAvailable

0x40C00000

GoodResultsMayBeIncomplete

0x00BA0000

BadNotTypeDefinition

0x80C80000

UncertainReferenceOutOfServer

0x406C0000

BadTooManyMatches

0x806D0000

BadQueryTooComplex

0x806E0000

BadNoMatch

0x806F0000

BadMaxAgeInvalid

0x80700000

BadSecurityModeInsufficient

0x80E60000

BadHistoryOperationInvalid

0x80710000

BadHistoryOperationUnsupported

0x80720000

BadInvalidTimestampArgument

0x80BD0000

BadWriteNotSupported

0x80730000

BadTypeMismatch

0x80740000

BadMethodInvalid

0x80750000

BadArgumentsMissing

0x80760000

BadNotExecutable

0x81110000

BadTooManySubscriptions

0x80770000

BadTooManyPublishRequests

0x80780000

BadNoSubscription

0x80790000

BadSequenceNumberUnknown

0x807A0000

GoodRetransmissionQueueNotSupported

0x00DF0000

BadMessageNotAvailable

0x807B0000

BadInsufficientClientProfile

0x807C0000

BadStateNotActive

0x80BF0000

BadAlreadyExists

0x81150000

BadTcpServerTooBusy

0x807D0000

BadTcpMessageTypeInvalid

0x807E0000

BadTcpSecureChannelUnknown

0x807F0000

BadTcpMessageTooLarge

0x80800000

BadTcpNotEnoughResources

0x80810000

BadTcpInternalError

0x80820000

BadTcpEndpointUrlInvalid

0x80830000

BadRequestInterrupted

0x80840000

BadRequestTimeout

0x80850000

BadSecureChannelClosed

0x80860000

BadSecureChannelTokenUnknown

0x80870000

BadSequenceNumberInvalid

0x80880000

BadProtocolVersionUnsupported

0x80BE0000

BadConfigurationError

0x80890000

BadNotConnected

0x808A0000

BadDeviceFailure

0x808B0000

BadSensorFailure

0x808C0000

BadOutOfService

0x808D0000

BadDeadbandFilterInvalid

0x808E0000

UncertainNoCommunicationLastUsableValue

0x408F0000

UncertainLastUsableValue

0x40900000

UncertainSubstituteValue

0x40910000

UncertainInitialValue

0x40920000

UncertainSensorNotAccurate

0x40930000

UncertainEngineeringUnitsExceeded

0x40940000

UncertainSubNormal

0x40950000

GoodLocalOverride

0x00960000

GoodSubNormal

0x00EB0000

BadRefreshInProgress

0x80970000

BadConditionAlreadyDisabled

0x80980000

BadConditionAlreadyEnabled

0x80CC0000

BadConditionDisabled

0x80990000

BadEventIdUnknown

0x809A0000

BadEventNotAcknowledgeable

0x80BB0000

BadDialogNotActive

0x80CD0000

BadDialogResponseInvalid

0x80CE0000

BadConditionBranchAlreadyAcked

0x80CF0000

BadConditionBranchAlreadyConfirmed

0x80D00000

BadConditionAlreadyShelved

0x80D10000

BadConditionNotShelved

0x80D20000

BadShelvingTimeOutOfRange

0x80D30000

BadNoData

0x809B0000

BadBoundNotFound

0x80D70000

BadBoundNotSupported

0x80D80000

BadDataLost

0x809D0000

BadDataUnavailable

0x809E0000

BadEntryExists

0x809F0000

BadNoEntryExists

0x80A00000

BadTimestampNotSupported

0x80A10000

GoodEntryInserted

0x00A20000

GoodEntryReplaced

0x00A30000

UncertainDataSubNormal

0x40A40000

GoodNoData

0x00A50000

GoodMoreData

0x00A60000

BadAggregateListMismatch

0x80D40000

BadAggregateNotSupported

0x80D50000

BadAggregateInvalidInputs

0x80D60000

BadAggregateConfigurationRejected

0x80DA0000

GoodDataIgnored

0x00D90000

BadRequestNotAllowed

0x80E40000

BadRequestNotComplete

0x81130000

BadTransactionPending

0x80E80000

BadTicketRequired

0x811F0000

BadTicketInvalid

0x81200000

BadLocked

0x80E90000

BadRequiresLock

0x80EC0000

GoodEdited

0x00DC0000

GoodPostActionFailed

0x00DD0000

UncertainDominantValueChanged

0x40DE0000

GoodDependentValueChanged

0x00E00000

BadDominantValueChanged

0x80E10000

UncertainDependentValueChanged

0x40E20000

BadDependentValueChanged

0x80E30000

GoodEdited_DependentValueChanged

0x01160000

GoodEdited_DominantValueChanged

0x01170000

GoodEdited_DominantValueChanged_DependentValueChanged

0x01180000

BadEdited_OutOfRange

0x81190000

BadInitialValue_OutOfRange

0x811A0000

BadOutOfRange_DominantValueChanged

0x811B0000

BadEdited_OutOfRange_DominantValueChanged

0x811C0000

BadOutOfRange_DominantValueChanged_DependentValueChanged

0x811D0000

BadEdited_OutOfRange_DominantValueChanged_DependentValueChanged

0x811E0000

GoodCommunicationEvent

0x00A70000

GoodShutdownEvent

0x00A80000

GoodCallAgain

0x00A90000

GoodNonCriticalTimeout

0x00AA0000

BadInvalidArgument

0x80AB0000

BadConnectionRejected

0x80AC0000

BadDisconnect

0x80AD0000

BadConnectionClosed

0x80AE0000

BadInvalidState

0x80AF0000

BadEndOfStream

0x80B00000

BadNoDataAvailable

0x80B10000

BadWaitingForResponse

0x80B20000

BadOperationAbandoned

0x80B30000

BadExpectedStreamToBlock

0x80B40000

BadWouldBlock

0x80B50000

BadSyntaxError

0x80B60000

BadMaxConnectionsReached

0x80B70000

UncertainTransducerInManual

0x42080000

UncertainSimulatedValue

0x42090000

UncertainSensorCalibration

0x420A0000

UncertainConfigurationError

0x420F0000

GoodCascadeInitializationAcknowledged

0x04010000

GoodCascadeInitializationRequest

0x04020000

GoodCascadeNotInvited

0x04030000

GoodCascadeNotSelected

0x04040000

GoodFaultStateActive

0x04070000

GoodInitiateFaultState

0x04080000

GoodCascade

0x04090000

BadDataSetIdInvalid

0x80E70000

2.1.2.4 Сообщение ReverseHello

использовать

длина

описывать

URI сервера

Максимум 4096 байт

ApplicationUri сервера, отправляющего сообщение.

URL-адрес терминала

Максимум 4096 байт

URL-адрес конечной точки, используемый клиентом при установке SecureChannel.

Для протоколов на основе соединения, таких как TCP, сообщение ReverseHello позволяет серверу за брандмауэром подключиться к клиенту без открытого порта и запросить у клиента установить SecureChannel, используя сокет, созданный сервером.

Для протоколов на основе сообщений сообщение ReverseHello позволяет серверам сообщать клиентам о своем присутствии. В этом случае URL-адрес терминала указывает конкретный адрес сервера и все токены, необходимые для доступа к нему.

2.2 Структура сообщения безопасного диалога OPC UA

Формат сообщений OPC UA Secure Conversation предназначен для установления и поддержания зашифрованного и подписанного канала связи между клиентом и сервером.

использовать

заголовок сообщения

безопасная голова

заголовок последовательности

нагрузка

защитная ножка

длина

12byte

неопределенный

8byte

неопределенный

неопределенный

описывать

Контроль и запись сообщений

Содержит информацию, связанную с безопасностью. Существуют различия по симметричным и асимметричным алгоритмам безопасности.

Укажите серийный номер и идентификатор запроса

Это фактическая часть данных приложения, которая может быть зашифрована и/или подписана в зависимости от политики безопасности, определенной в заголовке безопасности.

(Необязательно) Если сообщение подписано, этот раздел содержит подпись. Не все политики безопасности требуют подписей.

2.2.1 Заголовок сообщения

использовать

Тип сообщения

Это конец?

размер сообщения

Идентификатор канала безопасности

длина

3byte

1byte

4byte

4byte

описывать

Используется для идентификации типов сообщений.

Однобайтовый код ASCII, указывающий, является ли это последним блоком в сообщении.

отзаголовок сообщенияначалосьдлина,Единица измерения — байты

Уникальный идентификатор SecureChannel, присвоенный сервером.

2.2.1.1 Тип сообщения

Существует три основных типа Тип сообщения:

  • Сообщения MSG зашифрованы с использованием ключа, связанного с каналом.
  • Сообщение OPN об открытии защищенного канала
  • Сообщение CLO о закрытии безопасного канала
2.2.1.2 Прекращение действия

Однобайтовый код ASCII, указывающий, является ли MessageChunk последним фрагментом сообщения.

Определяется как следующие значения:

  • Средний блок С.
  • F последний блок.
  • Последний блок (используется, когда возникает ошибка и сообщение прерывается).

Это поле действительно только для Типа. сообщения имеют смысл MSG, для других типов сообщения, это поле всегда «F».

2.2.1.3 Размер сообщения

отзаголовок сообщенияначалосьдлина,Единица измерения — байты

2.2.1.4 Идентификатор безопасного канала

Уникальный идентификатор SecureChannel, присвоенный сервером.,Если сервер получает неизвестный идентификатор пользователя безопасности,Должна быть возвращена соответствующая ошибка транспортного уровня.

2.2.2 Защитный заголовок

Определяет, какие операции шифрования применяются к сообщению. Существует две версии: заголовок безопасности асимметричного алгоритма и заголовок безопасности симметричного алгоритма.

2.2.2.1 Заголовок безопасности асимметричного алгоритма

использовать

длина

описывать

URI политики безопасностидлина

4byte

URI политики длина безопасности. Если URI не указан, это значение может быть 0 или -1. Другие отрицательные значения недействительны. Единица измерения — байты.

URI политики безопасности

неопределенный

URI политики безопасности, используемой для защиты сообщения. Это поле кодируется как строка UTF-8 без нулевого символа-терминатора.

Сертификат отправителядлина

4byte

Сертификат Длина отправителя. Если сертификат не указан, это значение может быть 0 или -1. Другие отрицательные значения недействительны. Единица измерения — байты.

Сертификат отправителя

неопределенный

Сертификат отправителя

Отпечаток сертификата получателядлина

4byte

Отпечаток сертификата получателяиздлина,если зашифровано,Тогда значение этого поля равно 20. если не зашифровано,Значение может быть 0 или -1. Единица измерения — байты。

Отпечаток сертификата получателя

неопределенный

Отпечаток пальца сертификата получателя. Если сообщение не зашифровано, это поле должно быть пустым.

2.2.2.2 Заголовок безопасности симметричного алгоритма

использовать

длина

описывать

Идентификатор токена

4byte

Уникальный идентификатор токена безопасности безопасного канала, используемого для защиты сообщения. Если сервер получит идентификатор токена, который он не распознает, он вернет соответствующую ошибку транспортного уровня.

2.2.3 Заголовок последовательности

использовать

длина

описывать

серийный номер

4byte

Монотонно увеличивающийся порядковый номер, присвоенный отправителем.

Идентификатор запроса

4byte

Идентификатор, назначаемый клиентом сообщениям запроса OPC UA. Все сообщения запроса и связанные с ним ответы используют один и тот же идентификатор.

2.2.4 Загрузка

Это основная часть сообщения, которая содержит фактические данные запроса или ответа на операцию. Размер полезной нагрузки является переменным и зависит от фактического объема передаваемых данных.

2.2.5 Защитные ножки

Этот раздел является необязательным и существует только при использовании определенных политик безопасности. Он содержит дополнительную информацию о безопасности, такую ​​как данные заполнения и подписи. Размер защитной ножки также варьируется и зависит от политики безопасности и используемых данных.

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.