<?xml version="1.0" encoding="utf-8"?>
<informationTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable">
  <infoTable>
    <nameOfIssuer>Amazon</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>023135106</cusip>
    <value>26162755</value>
    <shrsOrPrnAmt>
      <sshPrnamt>113347</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>113347</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Johnson &amp; Johnson</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>478160104</cusip>
    <value>35811388</value>
    <shrsOrPrnAmt>
      <sshPrnamt>173044</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>173043</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Waste Management</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>94106L109</cusip>
    <value>1378680</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6275</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>6275</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Sabine Royalty Trust</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>785688102</cusip>
    <value>479990</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>7000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Procter &amp; Gamble</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>742718109</cusip>
    <value>29737928</value>
    <shrsOrPrnAmt>
      <sshPrnamt>207508</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>207507</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Coca-Cola</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>191216100</cusip>
    <value>28743936</value>
    <shrsOrPrnAmt>
      <sshPrnamt>411156</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>411156</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Enterprise Products</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>293792107</cusip>
    <value>225061</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7020</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>7020</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>United Parcel Service</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>911312106</cusip>
    <value>1627672</value>
    <shrsOrPrnAmt>
      <sshPrnamt>16410</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>16409</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Medtronic</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>G5960L103</cusip>
    <value>556668</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5795</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>5795</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Netflix</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>64110L106</cusip>
    <value>937600</value>
    <shrsOrPrnAmt>
      <sshPrnamt>10000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>10000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Paccar</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>693718108</cusip>
    <value>41104591</value>
    <shrsOrPrnAmt>
      <sshPrnamt>375350</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>375350</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPDR S&amp;P 500 ETF Trust</nameOfIssuer>
    <titleOfClass>ETF</titleOfClass>
    <cusip>78462F103</cusip>
    <value>2876339</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4218</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>4218</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Mastercard</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>57636Q104</cusip>
    <value>1628150</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2852</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>2852</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Illinois Tool Works</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>452308109</cusip>
    <value>42627535</value>
    <shrsOrPrnAmt>
      <sshPrnamt>173072</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>173071</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Nordson</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>655663102</cusip>
    <value>51666720</value>
    <shrsOrPrnAmt>
      <sshPrnamt>214893</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>214892</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Emerson Electric</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>291011104</cusip>
    <value>35746505</value>
    <shrsOrPrnAmt>
      <sshPrnamt>269338</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>269337</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FedEx</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>31428X106</cusip>
    <value>1762136</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6100</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>6100</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Pepsico</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>713448108</cusip>
    <value>2441865</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17014</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>17014</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Black Stone Minerals</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>09225M101</cusip>
    <value>1594627</value>
    <shrsOrPrnAmt>
      <sshPrnamt>119987</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>119987</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Honeywell</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>438516106</cusip>
    <value>24624972</value>
    <shrsOrPrnAmt>
      <sshPrnamt>126224</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>126223</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Home Depot</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>437076102</cusip>
    <value>337181</value>
    <shrsOrPrnAmt>
      <sshPrnamt>980</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>979</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Automatic Data Processing</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>053015103</cusip>
    <value>46095876</value>
    <shrsOrPrnAmt>
      <sshPrnamt>179201</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>179201</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPDR Gold Shares</nameOfIssuer>
    <titleOfClass>ETF</titleOfClass>
    <cusip>78463V107</cusip>
    <value>372135</value>
    <shrsOrPrnAmt>
      <sshPrnamt>939</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>939</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Becton Dickinson</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>075887109</cusip>
    <value>1424474</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7340</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>7340</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Stellar Bancorp</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>858927106</cusip>
    <value>1436204</value>
    <shrsOrPrnAmt>
      <sshPrnamt>46419</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>46419</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Berkshire Hathaway Class B</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>084670702</cusip>
    <value>12629584</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25126</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>25126</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Adobe Systems</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>00724F101</cusip>
    <value>11965108</value>
    <shrsOrPrnAmt>
      <sshPrnamt>34187</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>34187</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Alphabet Class A</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>02079K305</cusip>
    <value>2327468</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7436</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>7436</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Intuit</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>461202103</cusip>
    <value>25518669</value>
    <shrsOrPrnAmt>
      <sshPrnamt>38523</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>38523</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Microsoft</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>594918104</cusip>
    <value>132447766</value>
    <shrsOrPrnAmt>
      <sshPrnamt>273867</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>273867</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Vanguard Information Technology ETF</nameOfIssuer>
    <titleOfClass>ETF</titleOfClass>
    <cusip>92204A702</cusip>
    <value>256285</value>
    <shrsOrPrnAmt>
      <sshPrnamt>340</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>340</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Amphenol</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>032095101</cusip>
    <value>52370547</value>
    <shrsOrPrnAmt>
      <sshPrnamt>387528</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>387528</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Alcon</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>H01301128</cusip>
    <value>18140225</value>
    <shrsOrPrnAmt>
      <sshPrnamt>230122</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>230122</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Eli Lilly</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>532457108</cusip>
    <value>811383</value>
    <shrsOrPrnAmt>
      <sshPrnamt>755</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>755</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Air Products &amp; Chemicals</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>009158106</cusip>
    <value>15436688</value>
    <shrsOrPrnAmt>
      <sshPrnamt>62492</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>62491</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Duke Energy</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>26441C204</cusip>
    <value>721193</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6153</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>6153</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Sysco</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>871829107</cusip>
    <value>681322</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9246</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>9245</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Phillips 66</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>718546104</cusip>
    <value>352279</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2730</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>2730</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Zebra Technologies</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>989207105</cusip>
    <value>12637324</value>
    <shrsOrPrnAmt>
      <sshPrnamt>52044</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>52044</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Meta Platforms</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>30303M102</cusip>
    <value>281207</value>
    <shrsOrPrnAmt>
      <sshPrnamt>426</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>426</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Texas Capital Bancshares</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>88224Q107</cusip>
    <value>316890</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>3500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Broadcom</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>11135F101</cusip>
    <value>560336</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1619</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>1619</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Novartis ADR</nameOfIssuer>
    <titleOfClass>ADR</titleOfClass>
    <cusip>66987V109</cusip>
    <value>436910</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3169</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>3169</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Accenture</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>G1151C101</cusip>
    <value>12075646</value>
    <shrsOrPrnAmt>
      <sshPrnamt>45008</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>45008</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Nvidia</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>67066G104</cusip>
    <value>2938308</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15755</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>15755</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WW Grainger</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>384802104</cusip>
    <value>1846562</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1830</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>1830</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Abbvie</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>00287Y109</cusip>
    <value>2524822</value>
    <shrsOrPrnAmt>
      <sshPrnamt>11050</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>11050</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Taiwan Semiconductor</nameOfIssuer>
    <titleOfClass>ADR</titleOfClass>
    <cusip>874039100</cusip>
    <value>80443026</value>
    <shrsOrPrnAmt>
      <sshPrnamt>264711</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>264711</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Stryker</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>863667101</cusip>
    <value>22431494</value>
    <shrsOrPrnAmt>
      <sshPrnamt>63822</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>63821</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Intuitive Surgical</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>46120E602</cusip>
    <value>37948385</value>
    <shrsOrPrnAmt>
      <sshPrnamt>67004</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>67004</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>McDonalds</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>580135101</cusip>
    <value>376231</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1231</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>1231</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Dover</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>260003108</cusip>
    <value>40587727</value>
    <shrsOrPrnAmt>
      <sshPrnamt>207886</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>207886</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Nokia ADR</nameOfIssuer>
    <titleOfClass>ADR</titleOfClass>
    <cusip>654902204</cusip>
    <value>96843</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14968</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>14968</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Cintas</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>172908105</cusip>
    <value>33299466</value>
    <shrsOrPrnAmt>
      <sshPrnamt>177059</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>177058</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Donaldson</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>257651109</cusip>
    <value>44605964</value>
    <shrsOrPrnAmt>
      <sshPrnamt>503113</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>503112</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Ecolab</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>278865100</cusip>
    <value>40763595</value>
    <shrsOrPrnAmt>
      <sshPrnamt>155278</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>155278</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>McCormick &amp; Co</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>579780206</cusip>
    <value>15609663</value>
    <shrsOrPrnAmt>
      <sshPrnamt>229183</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>229183</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Thermo Fisher Scientific</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>883556102</cusip>
    <value>17919221</value>
    <shrsOrPrnAmt>
      <sshPrnamt>30925</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>30924</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Dorchester Minerals</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>25820R105</cusip>
    <value>1172178</value>
    <shrsOrPrnAmt>
      <sshPrnamt>52423</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>52423</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Chevron Corp</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>166764100</cusip>
    <value>1477624</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9695</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>9695</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Conocophillips</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>20825C104</cusip>
    <value>378184</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4040</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>4040</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>First Financial Bankshares</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>32020R109</cusip>
    <value>219126</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7336</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>7336</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Walmart</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>931142103</cusip>
    <value>290112</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2604</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>2604</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IBM</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>459200101</cusip>
    <value>529623</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1788</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>1788</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Texas Instruments</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>882508104</cusip>
    <value>15651892</value>
    <shrsOrPrnAmt>
      <sshPrnamt>90218</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>90217</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>3M</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>88579Y101</cusip>
    <value>423465</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2645</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>2645</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Alphabet Class C</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>02079K107</cusip>
    <value>990353</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3156</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>3156</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Amgen</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>031162100</cusip>
    <value>221262</value>
    <shrsOrPrnAmt>
      <sshPrnamt>676</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>676</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>San Juan Basin Royalty Trust</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>798241105</cusip>
    <value>957019</value>
    <shrsOrPrnAmt>
      <sshPrnamt>170288</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>170288</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Eaton</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>G29183103</cusip>
    <value>15802555</value>
    <shrsOrPrnAmt>
      <sshPrnamt>49614</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>49614</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Lam Research</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>512807306</cusip>
    <value>2310930</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>13500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Bristol-Myers Squibb</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>110122108</cusip>
    <value>448727</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8319</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>8319</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Exxon Mobil</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>30231G102</cusip>
    <value>7086505</value>
    <shrsOrPrnAmt>
      <sshPrnamt>58887</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>58887</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Lowes</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>548661107</cusip>
    <value>527104</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2186</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>2185</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Apple</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>037833100</cusip>
    <value>75709512</value>
    <shrsOrPrnAmt>
      <sshPrnamt>278487</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>278487</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Abbott Labs</nameOfIssuer>
    <titleOfClass>Stock</titleOfClass>
    <cusip>002824100</cusip>
    <value>1552099</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12388</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <otherManager>0</otherManager>
    <votingAuthority>
      <Sole>12388</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
</informationTable>
